Oracle的超大数据类型

Oracle的超大数据类型

OrlceVARCHAR2

         在使用数据库的时候字符数据一般使用VARCHAR2, VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。Oracle Database中,VARCHAR2 字段类型,最大值为4000PL/SQL VARCHAR2 变量类型,最大字节长度为32767 VARCHAR2 容纳不下我们需要存储的信息时,就出来的Oracle的大数据类型LOB( Large Object,大型对象)

      项目中遇到的问题:在协议签署时,因为要请求其他服务的库,传输报文入库留存协议记录,有些协议配置过多的时候入库字段很长会出问题,最后决定将varchar2改成CLOB(字符型大型对象);

Orlce中的LOB类型

     ·  在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。

·  LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。

·  而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。

操作

      1.普通方式:

           普通查询看不到CLOB类型的字段内容,普通插入也会因为Oracle的隐式转换

      2.使用pl/sql的函数

--使用PL/SQL语法,采取绑定变量的方式解决,而不是直接拼接SQL

DECLARE

       V_LANG CLOB := '待插入的海量字符串';

       V_UPDATE CLOB := '更新的海量字符串';

BEGIN

  INSERT INTO temp t VALUES ('Grand.Jon', 22, V_LANG);        --增加

  UPDATE temp t SET t.temp_clob = V_UPDATE WHERE rownum = 1;  --修改

  SELECT t.NAME, dbms_lob.substr(t.temp_clob) FROM TEMP t;    --查询将CLOB转成字符类型

  DELETE temp t WHERE rownum = 1;                             --按列删除  

  COMMIT;

END;

3. CLOB的操作我们在存储过程中基本上使用 dbms_lob substr , append , write 等方法。

                dbms_lob.createtemporary(V_SQL,true);     --创建一个临时clo用来存储拼接的sql

                   dbms_lob.write(v_SQL,'写入信息');          --写入操作

                   dbms_lob.append(v_SQL,',');               --拼接clob

                 dbms_lob.substr(v_SQL);                   --截取clob,不传参数就是全部读取

                   dbms_lob.freetemporary(v_SQL);            --释放clob

         4.Java中操作CLOB:

                   新增:

                    先插入一个空的CLOB,然后锁列,

        String sql = "insert into temp values(?,?,empty_clob())";
          String sqlClob = "select temp_clob from temp t where t.name=? for update";
          然后查询出这个空的字段         
                    clob = (CLOB) rs.getClob(1);
                    writer = clob.getCharacterOutputStream(); //拿到clob的字符输入流
                    writer.write(article.getContent());
                    writer.flush();
                    writer.close();
          更新:原生的JDBC中有setClob()方法;
              CLOB clob   = oracle.sql.CLOB.createTemporary(conn,false,oracle.sql.CLOB.DURATION_SESSION);
              clob.setString(1L, content);
              pst = conn.prepareStatement(sql);
              pst.setClob(1, clob);
              pst.setString(2,name);
              result = pst.executeUpdate();
          查询:
                Clob clob = rs.getClob("temp_clog");
                Reader rd = clob.getCharacterStream();
                char [] str = new char[12];
                while(rd.read(str) != -1) {
                    builder.append(new String(str));
                }
                article.setContent(builder.toString());
 四 其他
      虽然CLOB能解决VARCHAR2字符大小的限制,但是DBA们都不建议用这些来处理,可能效率问题吧,大的文件应该放在服务器上,然后Database中存响应地址即可。其他持久层框架都进行了响应的封装,所以我们使用的时候直接配置变量的类型为CLOB就可以。
          
                    
 

 

 

 

你可能感兴趣的:(数据库)