精华内容
下载资源
问答
  • 有的时候给Oracle的blob赋值会出现乱码,通常是程序编码的方式和数据用得编码方式不一样。像我之前就是程序用得是UTF-8,而Oracle数据库则是GBK。 总的来所分俩种情况: 程序和数据编码一致: -- 注意rawtohex()函数...

    有的时候给Oracle的blob赋值会出现乱码,通常是程序编码的方式和数据用得编码方式不一样。像我之前就是程序用得是UTF-8,而Oracle数据库则是GBK。

    总的来所分俩种情况:

    1. 程序和数据编码一致:
      -- 注意rawtohex()函数是用数据库字符编码格式来生成十六进制字符串的
      update act_hi_comment t set t.full_msg_ = rawtohex('哈哈哈哈哈')  where t.id_ = '1234';

    2. 程序和数据编码不一致
      -- 先用程序用自己的编码方式将字符串转换成十六进制字符串
      update act_hi_comment t set t.full_msg_ = '这里是十六进制字符串' where id_ = '111';

    create table ACT_HI_COMMENT
    (
      id_           NVARCHAR2(64) not null,
      type_         NVARCHAR2(255),
      time_         TIMESTAMP(6) not null,
      user_id_      NVARCHAR2(255),
      task_id_      NVARCHAR2(64),
      proc_inst_id_ NVARCHAR2(64),
      action_       NVARCHAR2(255),
      message_      NVARCHAR2(2000),
      full_msg_     BLOB
    );

    Oracle 给blob字段设置值的时候,它是可以接收十六进制的值,所以我们可以这样操作:

    -- update act_hi_comment t set t.full_msg_ = '这里可以是十六进制字符串';
    -- 或者下面这种形式
    -- 注意rawtohex()函数是用数据库字符编码格式来生成十六进制字符串的
    update act_hi_comment t set t.full_msg_ = rawtohex('哈哈哈哈哈')  where t.id_ = '1234';

    如果你的程序显示不是乱码了,那么就看到这里吧。


    如果还是乱码,或者想了解更详细就继续往下

    首先连接Oracle分thinoci方式:(如:jdbc:oracle:thin:@10.1.1.2:1521:shdb     jdbc:oracle:oci:@shdb   JDBC驱动oci和thin区别

    1. 走jdbc方式连接数据库,则客户端发送数据的编码都是UTF-8;

    2. 走oci方式连接数据库,则根据数据库的编码方式决定客户端的编码方式:

    (A)数据库采样UTF-8的时候,客户端发送的编码也是UTF-8;

    (B)数据库采用GBK的时候,则客户端发送的编码是GBK。

    -- 查看oracle服务端编码:
    select * from sys.nls_database_parameters where parameter = 'NLS_CHARACTERSET';
    -- ZHS16GBK
    
    -- 查看client编码:
    select * from sys.nls_instance_parameters where parameter = 'NLS_LANGUAGE';
    -- SIMPLIFIED CHINESE

    由上面原因可知,java程序连oracle走JDBC,传的都是UTF-8编码格式的内容;而PLSQL和oralce是走oci去连接的,用的编码是GBK。

    这也就是PLSQL里面进行的update,java读取出来后交页面显示是乱码的原因了(PLSQL用GBK编码存进数据库,java用UTF-8解码读出来,编码和解码不一致)。

    所以只要保证存进去的时候用UTF-8编码即可。于是我就用java程序把字符按照UTF-8编码成二进制,然后再二进制转十六进制,最后把得到的十六进制的字符串update进去

    public class Test {
    
        public static void main(String[] args) {
            String name = "我是一段字符串";
    
            System.out.println(bytesToHexString(name.getBytes(StandardCharsets.UTF_8)));
            // E68891E698AFE4B880E6AEB5E5AD97E7ACA6E4B8B2
    
            // System.out.println(bytesToHexString(name.getBytes(Charset.forName("GBK"))));
            // CED2CAC7D2BBB6CED7D6B7FBB4AE
        }
    
        public static String bytesToHexString(byte[] bArr) {
            StringBuilder sb = new StringBuilder(bArr.length);
            String sTmp;
    
            for (byte b : bArr) {
                sTmp = Integer.toHexString(0xFF & b);
                if (sTmp.length() < 2) {
                    sb.append(0);
                }
                sb.append(sTmp.toUpperCase());
            }
    
            return sb.toString();
        }
    }
    update act_hi_comment t set t.full_msg_ = 'E68891E698AFE4B880E6AEB5E5AD97E7ACA6E4B8B2'  where t.id_ = '1234';

    这样就可以搞定了。

    (题外话:当中文字符以thin方式存储到数据库时,数据库还是会对照的转换成oracle服务端编码(在这里是GBK);查数据时还好再转回UTF-8。这也就是明明数据库是GBK编码,而Java程序中用UTF-8,却不会乱码的原因)

    补充1种Oracle方式:

    select convert(UTL_RAW.CAST_TO_VARCHAR2(t.full_msg_), 'zhs16gbk', 'AL32UTF8'), t.* 
    from wf.act_hi_comment t  where t.proc_inst_id_ ='415696';
    
    select UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CONVERT(t.full_msg_, 'AMERICAN_AMERICA.zhs16gbk', 'AMERICAN_AMERICA.AL32UTF8')) 
    from wf.act_hi_comment t  where t.proc_inst_id_ ='415696';

    展开全文
  • 转至:http://www.th7.cn/db/Oracle/201501/86125.shtml oracle 通过 nvl( )... 说明:当col为空时取val作为返回值,当col不为空时取col值。    用处:最主要的是格式化数据,比如计算金额时,不想出现空数...

    转至:http://www.th7.cn/db/Oracle/201501/86125.shtml

    oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值

    oracle 函数介绍之nvl

      函数声明:nvl(col,val)

      说明:当col为空时取val作为返回值,当col不为空时取col值。

       用处:最主要的是格式化数据,比如计算金额时,不想出现空数据,可以使用nvl(JINE,0)来得到0。由于null+(或-,*,/)数字等于 null,所以在表达式中对可能为空的值要使用nvl由于null!=null,有时对可能为空的列进行条件查询时,可能出现结果集丢失数据问题,加上 nvl就不会了。

    经典用法:

    通过查询获得某个字段的合计值,如果这个值为null将给出一个预设的默认值例如:select nvl(sum(t.字段),1)  from table t就表示如果sum(t.字段) = NULL 就返回 1另一个有关的有用方法declare i integerselect nvl(sum(t.字段),1) into i from table t 这样就可以把获得的合计值存储到变量i中,如果查询的值为null就把它的值设置为默认的1orcale 中:select nvl(rulescore,0) from zwjc_graderule where rulecode='FWTD'; 如果记录中不存在rulecode ='FWTD'的数据.则查不出数据.select nvl(rulescore,0) into rule_score from zwjc_graderule where rulecode='FWTD';会报查不到数据的错select nvl(sum(rulescore),0) from zwjc_graderule where rulecode='FWTD'; 如果记录中不存在rulecode ='FWTD'的数据.还是可以得到一行列名为nvl(rulescore,0),值为0的数据.select nvl(sum(rulescore),0) into rule_score from zwjc_graderule where rulecode='FWTD'; 不会报错

    oracle 函数介绍之nvl2

    Oracle在NVL函数的功能上扩展,提供了NVL2函数。NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函数返回E3,否则返回E2。E2和E3类型不同的话,E3会转换为E2的类型。

     限制: 1) E1可以是任意类型,E2,E3不能是long类型。
           2) 如果 E2是字符类型,那么E3转为字符型再比较(null除外)。
           3) 如果 E2是数值类型,那么E3也转为对应的数值类型。
           4) 各个参数都不能是逻辑表达式.

     

    oracle 函数介绍之nullif

    格式: nullif(expr1,expr2)  等价于 "case when expr1 = expr 2 then null else expr1 end",相等返回NULL,不等返回expr1.
    限制: expr1不能是标识符null,录入nullif(null,expr2)那么会提示错误。
               expr1,expr2 都必须是一个变量或者是一个常量表达式,不能是逻辑表达式。

    oracle 函数介绍之lnnvl(a) 

     

    a是一个表达式
    lnnvl只能用于where子句中;表达式的操作符号不能包含 AND, OR,  BETWEEN。
    如果a的结果是false或者是unknown,那么lnnvl返回true;如果a的结果是true,返回false.
    "如果a的结果是false或者是unknown,那么lnnvl返回true",这个很重要,因为一个空值或者unknown的值和另外一个常量或者有值的变量比较的时候,返回的总是unknown,所以
    lnnvl(a>10)  等价于  nvl(a,0)<=10    等价于  a<=10 or a is null  (假设a number(10))
    说白了,lnnvl是一种特定的用于简化表达式的函数,orcle解析的时候,应该会解析为 "a<=10 or a is null".  

     

    oracle 函数介绍之decode()

    decode()函数简介:

    主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);

    使用方法:

    Select decode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    From talbename

    Where …

    其中columnname为要选择的table中所定义的column,

    ·含义解释:

    decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)的理解如下:

    if (条件==值1)

     then    

    return(翻译值1)

    elsif (条件==值2)

    then    

    return(翻译值2)    

    ......

    elsif (条件==值n)

     then    

    return(翻译值n)

    else    

    return(缺省值)

    end if

    注:其中缺省值可以是你要选择的column name 本身,也可以是你想定义的其他值,比如Other等;

    举例说明:

    现定义一table名为output,其中定义两个column分别为monthid(var型)和sale(number型),若sale值=1000时翻译为D,=2000时翻译为C,=3000时翻译为B,=4000时翻译为A,如是其他值则翻译为Other;

    SQL如下:

    Select monthid , decode (sale,1000,'D',2000,'C',3000,'B',4000,'A',’Other’) sale from output

    特殊情况:

    若只与一个值进行比较

    Select monthid ,decode(sale, NULL,‘---’,sale) sale from output

    另:decode中可使用其他函数,如nvl函数或sign()函数等;

    NVL(EXPR1,EXPR2)

    若EXPR1是NULL,则返回EXPR2,否则返回EXPR1.

    SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1;

    如果用到decode函数中就是

    select monthid,decode(nvl(sale,6000),6000,'NG','OK') from output

     

    sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1,

    如果取较小值就是

    select monthid,decode(sign(sale-6000),-1,sale,6000) from output,即达到取较小值的目的。

    转载于:https://www.cnblogs.com/luoxiaolei/p/4807211.html

    展开全文
  • oracle数据库字段NULL赋值情况处理

    千次阅读 2016-11-18 09:29:23
    在存储过程中常用到字段值赋变量的情况,此时主要会出现两种情况 一,能查询到记录  记录中字段值又分两种情况  1、字段有值  2、字段NULL 二、查询不到记录,COUNT返回0 --一下是代码测试情况...

    在存储过程中常用到字段值赋给变量的情况,此时主要会出现两种情况

    一,能查询到记录

           记录中字段值又分两种情况

           1、字段有值

          2、字段值为NULL

    二、查询不到记录,COUNT返回为0


    --一下是代码测试情况

    -测试
    SQL> select empno,sal,comm from emp where empno=7369;

         EMPNO        SAL       COMM
    ---------- ---------- ----------
          7369        800

    SQL> declare v_empno number(6);
      2  v_sal number(6);
      3  v_comm number(6);
      4  begin
      5  select empno,sal,comm into v_empno,v_sal,v_comm from emp where empno=7369;
      6  dbms_output.put_line('empno='||v_empno);
      7  dbms_output.put_line('sal='||v_sal);
      8  dbms_output.put_line('comm='||v_comm);
      9  end;
     10  /
    empno=7369
    sal=800
    comm=

    SQL> declare v_empno number(6);
      2  v_sal number(6);
      3  v_comm number(6);
      4  begin
      5  select comm into v_comm from emp where empno=7369;
      6  dbms_output.put_line('comm='||v_comm);
      7  end;
      8  /
    comm=


    SQL> select * from emp where empno=7368;

    未选定行

    --未查询到记录,直接赋值则会抛出异常,针对这种情况,应做异常情况判断处理


    SQL> declare v_empno number(6);
      2  v_sal number(6);
      3  v_comm number(6);
      4  begin
      5  select comm into v_comm from emp where empno=7368;
      6  dbms_output.put_line('comm='||v_comm);
      7  end;
      8  /
    declare v_empno number(6);
    *
    第 1 行出现错误:
    ORA-01403: 未找到数据
    ORA-06512: 在 line 5

    SQL> declare v_comm number(6);
      2  begin
      3  select comm into v_comm from emp where empno=7368;
      4  dbms_output.put_line('comm='||v_comm);
      5  exception
      6  when others then
      7  dbms_output.put_line('no_date_found');
      8  end;
      9  /
    no_date_found

    PL/SQL 过程已成功完成。

    --处理空记录情况
    SQL> declare v_comm number(6);
      2  v_cnt number(6);
      3  begin
      4  select count(*) into v_cnt from emp where empno=7368;
      5  if v_cnt > 0 then
      6  select comm into v_comm from emp where empno=7368;
      7  dbms_output.put_line('comm='||v_comm);
      8  end if;
      9  exception
     10  when others then
     11  dbms_output.put_line('no_date_found');
     12  end;
     13  /

    PL/SQL 过程已成功完成。

    展开全文
  • Oracle 数据库中null字段赋值方法

    千次阅读 2019-05-28 16:10:11
    最近做数据迁移工作,某个字段在源表中可为空,在目标表中不能为空。迁移数据的时候需要查出的空值赋一个默认值。 用到的函数为: NVL(expr1,expr2) expr1:可为空字段或者表达式。 expr2:null的替代值。 ...

    最近做数据迁移工作,某个字段在源表中可为空,在目标表中不能为空。迁移数据的时候需要给查出的空值赋一个默认值。

    用到的函数为:

    NVL(expr1,expr2)
    expr1:可为空的字段或者表达式。
    expr2:null的替代值。

    含义:如果表达式 expr1 为空(NULL),则显示表达式 expr2 的值,若非空,则显示expr1 的值。

    select parentid,NVL(parentid,999) from PROPERTYRELATION  (下图第一列是原始数据,第二列是转化后的数据,本例中该字段是数据。若为字符串,则999需要加上单引号,'999')

    类似的函数有:

    NVL2(expr1,expr2, expr3)

    含义:若第一个参数为空,则显示二个参数的值;若第一个参数不为空,则显示第三个参数的值。

    NULLIF(exp1,expr2)

    含义:如果第一个参数和第二个参数相等,则显示空;否则显示第一个参数的值。

    COALESCE (expression_1, expression_2, ...,expression_n)

    含义:依次参考各参数表达式,遇到非null值即停止并显示该值。如果所有的表达式都是空值,最终将显示一个空值。
    --------------------- 
    作者:帅师傅 
    来源:CSDN 
    原文:https://blog.csdn.net/shuaishifu/article/details/37062049 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • CASE语句在Oracle中重新指定字段赋值的用法本文我们主要介绍了CASE语句在Oracle中重新指定字段赋值的一种用法,并出了示例加以验证说明,希望能够对您有所帮助。AD:CASE语句在Oracle中重新指定字段赋值的...
  • 成功解决:oracle字段为空,将java代码中得到的null值改为空一、首先从sql语句中尝试,用了两种方法:nvl语句和decode语句二、sql语句行不通,所以在java代码中用if语句进行过滤 一、首先从sql语句中尝试,用了两...
  • oracle给日期赋值

    千次阅读 2017-09-30 10:00:36
    update PL_TOTAL_STOCK t set t.xiaoqi = to_date('2019-07-31','yyyy-MM-dd') where t.id = '830885870f684492b4dedbaf0d22fc2a';
  • 我们在orcal中写查询sql语句时,往往会遇到判断某个字段的值并对其进行转码成我们需要的值,例如:数据库中字段“是否贵宾客户”存的值0、1,0表示是,1表示否,在我们查询时如果不在sql中进行转码的话。...
  • 将同一表中某一字段赋值给另外一个字段的语句update jxc_ckmx ckmx1 set ckmx1.ddsl = (select ckmx2.sl from jxc_ckmx ckmx2 where ckmx2.id = ckmx1.id); 转载于:...
  • oracle 变量赋值方法总结

    万次阅读 2016-09-07 22:41:24
    CREATE OR REPLACE Procedure grantValue Is v_tabName Varchar2(50); v_recordNum Number; v_var Varchar2(50) := '直接赋值法'; -- 方法1 直接赋值 v_minvar Varchar2(50); v_sql
  • Oracle中使用SQL插入语句对类型Timestamp和Date的字段赋值
  • select f1,f2,f3 into v1,v2,v3 from tab1 转载于:https://www.cnblogs.com/senyier/p/7666313.html
  • update table_complaint t set t.cptdatetime = nvl2(t.cptdatetime, '', to_char(to_date(t.cptdatetime, '...
  • 场景:当查询数据库的值为空时,这个值又需要后续的计算,这个时候就得把空值赋值为0 例子: select SUM(A.YQNJ) AS YQNJ from formtable_main_40 A where A.qjqsrq>=CONCAT(to_char(sysdate,'yyyy'),'-03-01'...
  • 突然项目中我说,新加一个字段完了,又要我初始化,然后我以为Navicat可以替我初始化默认值,结果没有设置成功,不知道是不是我操作不对,于是想通过sql语句批量处理一下; 然后发现竟是这个问题;添加该字段由...
  • 给为0或者null或者nan的字段赋值

    千次阅读 2019-11-13 16:39:26
    当rrr字段没有值或者null或者nan时赋值为0,否者现实rrr本身 ,case when length(cast (t.rrr as string))=0 or t.rrr is null or cast(t.rrr as string)=‘nan’ then 0 else round(t.rrr,15) end rrr ...
  • MySQL 中实现将 一张表table1 中的字段name 等于table2 中的字段 name 通过相同字段no相连,实现如下: ...(前提是两张表至少有两个字段相关联的,仅供参考MySQL,Oracle则有不同)  Oracle------...
  • 在做项目时,经常需要在量表之间进行字段赋值进行初始化 例如: update TB_PER_INTERNALDISMISSION ti set ti.C_UNITID = nvl((select ts.C_OLDUNITID from TB_PER_STAFFRECORD ts where ts.c_
  • oracle 字段别名

    2020-12-12 11:23:52
    像 type,level这些字眼都是oracle的保留字,在数据表设计的时候,应该避免将字段采用这样的保留字来命名,否则可能会产生一些异常,带来不便。 如果非要用来命名,该咋办呢?,可以用双引号将它引起来,比如 create...
  • 话不多说,先贴代码 DECLARE CURSOR MY_CUR IS SELECT T.EMPNO, T.DEPTNO, T.SAL ...根据EMP表中EMPNO的不同值,截取DEPTNO的字段作为 除数,更改SAL字段。 WHERE CURRENT OF MY_CUR--指定当前游标行
  • mysql 表table_a B字段赋值给A字段 update 语句 -- 同一个表 UPDATE table_a SET A=(SELECT B FROM (SELECT * FROM table_a) b WHERE b.id = table_a.id) -- 两个表 UPDATE table_a SET A = (SELECT B FROM ...
  • 我们一般会对查不出来的数据,不想某个字段为null,想他自己定义一个值 可以看到user_roles表中不存在id = 10000000000000的数据, 如果直接使用IFNULL则不会出现预期的效果 因为这里IFNULL()函数无法针对不存在...
  • 表里的某个字段是空值,但其实它是引用另一个表里面的值的,现在我想把所有的有空值的字段给它赋在另一个表中对应的字段的相应的值update au_window_re_project aw set aw.project_name = (select ap.SERVICENAME ...
  • 为oracle字段添加自增

    2015-04-07 16:51:58
    说明:先创建一个表 tab(id number,……) ...上面的代码创建名 xulieming 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。
  • 一、创建数据表 create table t(id integer,name varchar2(50)) 二、添加数据 insert into t values(1,'zhao')insert into t values(2,'qian')insert into t values(3,'sun')...三、case用法:重新指定字段赋值...
  • Oracle游标动态赋值

    千次阅读 2016-11-22 09:51:00
    1. oracle游标动态赋值的小例子 -- 实现1:动态游标赋值 -- 实现2:游标用表的rowtype声明,但数据却只配置表一行的某些字段时,遍历游标时需fetch into到精确字段 CREATE OR REPLACE PROCEDURE proc_cursor1( -...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,584
精华内容 12,633
关键字:

oracle给字段赋值为空