精华内容
下载资源
问答
  • 有的时候给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';

    展开全文
  • CASE语句在Oracle中重新指定字段赋值的用法本文我们主要介绍了CASE语句在Oracle中重新指定字段赋值的一种用法,并出了示例加以验证说明,希望能够对您有所帮助。AD:CASE语句在Oracle中重新指定字段赋值的...
    CASE语句在Oracle中重新给指定字段赋值的用法


    本文我们主要介绍了CASE语句在Oracle中重新给指定字段赋值的一种用法,并给出了示例加以验证说明,希望能够对您有所帮助。

    AD

    CASE语句Oracle中重新给指定字段赋值的用法是本文我们主要要介绍的内容,首先我们需要创建数据库和添加数据,然后我们以两个实例来介绍这一用法,接下来我们就开始介绍这一部分内容。

    一、创建数据表

    1. create table t(  
    2. id integer,  
    3. name varchar2(50)  

    二、添加数据

    1. insert into t values(1,'zhao')  
    2. insert into t values(2,'qian')  
    3. insert into t values(3,'sun')  
    4. insert into t values(4,'li') 

    三、case语句用法:重新给指定字段赋值

    例题1:

    1. select t.Name,  
    2. (case t.id--此处可以省略括号,改变id为name  
    3. when 1 then 'zhao'  
    4. when 2 then 'qian'  
    5. when 3 then 'sun'  
    6. else 'li'  
    7. end) --注意不要丢掉end关键字哦  
    8. from T t 

    扩展:重新给指定字段赋值另一种方法:decode()的用法

    1. select name, decode(id,1,'zhao',2,'qian',3,'sun','li') from T 

    例题2:

    1. select name,  
    2. case   
    3. when id<=2 then 0  
    4. when id=3 then 1  
    5. else 2  
    6. end "targer" --定义别名,此处为双引号哦  
    7. from T 
    8. 注:如果该case语句使用ctas建表的话,则end后面不能使用别名,应该为end targer,作为该case语句的列名,如果使用双引号,则该列名oracle无法识别
        例题3:

    case

    1. select name,
    2. case
    3. when delinquent_amounts_lasttime = '?' then 0
    4. else to_number(delinquent_amounts_lasttime)   --否则将源数据转为number类型
    5. end delinquent_amounts_lasttime
    6. from mobile_standard
    7. where rownum <= 30;

    以上就是CASE语句在Oracle中重新给指定字段赋值的用法,本文就介绍到这里了,希望本次的介绍能够对您有所帮助。

    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(754) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
    展开全文
  • 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的替代值。 含义:如果表达式expr1 为空(NULL),则显示表达式expr2 的值,若非空...

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

    用到的函数为:

    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 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 将同一表中某一字段赋值给另外一个字段的语句update jxc_ckmx ckmx1 set ckmx1.ddsl = (select ckmx2.sl from jxc_ckmx ckmx2 where ckmx2.id = ckmx1.id); 转载于:...
  • 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';
  • 在做项目时,经常需要在量表之间进行字段赋值进行初始化 例如: update TB_PER_INTERNALDISMISSION ti set ti.C_UNITID = nvl((select ts.C_OLDUNITID from TB_PER_STAFFRECORD ts where ts.c_
  • 一、创建数据表 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用法:重新指定字段赋值...
  • MySQL 中实现将 一张表table1 中的字段name 等于table2 中的字段 name 通过相同字段no相连,实现如下: ...(前提是两张表至少有两个字段相关联的,仅供参考MySQL,Oracle则有不同)  Oracle------...
  • Oracle中使用SQL插入语句对类型为Timestamp和Date的字段赋值
  • select f1,f2,f3 into v1,v2,v3 from tab1 转载于:https://www.cnblogs.com/senyier/p/7666313.html
  • SELECT user_id || '|' || user_name as ss FROM Table
  • advp表部分记录的projectname和groupname两个字段值丢失,由于trp_reportitem 表中可以找到对应的数据,于是通过该表进行数据还原.trp_advp中一条记录对应trp_reportitem中的多条记录,因此需要对trp_reportitem分组...
  • 表 assets_cards 的id 是表 LETTING_DETAILSES 的外键,表里字段serial_number 的数据也以pre_serial_number字段存在 表LETTING_DETAILSES,id 与serial_number是一一对应的! 由于测试数据库的表assets_cards与...
  • oracle和SQLSERVER的多字段赋值

    千次阅读 2012-04-27 10:59:02
    但在ORACLE的PLSQL下 select into 只能赋值单个变量,不能进行多变量同时赋值。  如 : select count(*) into nb_count from t_khz where fzbh=V_fzbh; 多变量赋值一般采取游标FETCH的方式: cursor c_rw ...
  • Oracle游标动态赋值

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

    千次阅读 2012-08-17 20:27:48
    /****************************/ --表名 个人客户扩展表  --1 C_ASSETFAVOUR 资产投资偏好 --2 C_ACTINVESTFAVOUR 实际风险偏好 --3 C_PRORAISEFAVOUR 产品类型投资偏好 --4 C_ACTPRORAISEFAVOUR 实际产品类型...
  • 假如我有一个人员信息表,表的字段结构如下: 姓名 性别 性别值 性别字段,如果为男,性别值为0; 性别字段,如果为女,性别值为1; 性别字段,如果为中性,性别值为3; 在插入记录的时候,只会插入 姓名和...
  • 为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 ...
  • oracle增加字段、删除字段、修改字段类型
  • 不要建表insert,纯分析函数+高阶查询实现,因为要实时放出来做展示 <p style="text-align:center"><img alt="" height="679" src=... 求大神指教!</p>
  • oracle对null赋值默认值

    千次阅读 2016-06-15 15:56:22
    expr1:可为空的字段或者表达式。 expr2:null的替代值。 含义:如果表达式 expr1 为空(NULL),则显示表达式 expr2 的值,若非空,则显示expr1 的值。 select parentid,NVL(parentid,999) from ...
  • select a.*,lag(a.id,1) over (order by id desc) lag from 表 alag(要选择的字段,前面一条) over(根据字段排序)lag
  • Oracle SQL 排序 赋值

    2017-10-23 15:26:52
    如图所示: ... 想将按照 bonus 字段排序的结果,将ranging字段赋值1,2,3(如图中红色字体)求如何实现,在线等急急急 [img=https://img-bbs.csdn.net/upload/201710/23/1508743520_108061.png][/img]
  • 这个sql语句查找出来的,怎么将第一行的某个字段赋值给第二行的字段
  • 从表tab1选择3个字段f1,f2,f3赋值给这三个变量,要如何写如果单个变量可以selectf1intov1fromtab1 如果多个变量可以 selectf1,f2,f3intov1,v2,v3fromtab1 转载于:https://www.cnblogs.com/zbl3033/p/397546...
  • 在插入一个表的时候,需要根据一个字段的值更新另一个字段的值。当然也可以通过程序就能很简单得实现,只是这个字段只是数据交换用,和系统主业务没关系,不想修改程序,所以才用触发器的方式实现。 表结构定义...

空空如也

空空如也

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

oracle给字段赋值