Oracle的超大数据类型
一 Orlce中VARCHAR2
在使用数据库的时候字符数据一般使用VARCHAR2, VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。在Oracle Database中,VARCHAR2 字段类型,最大值为4000;PL/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就可以。