实例讲解如何处理CLOB字段的动态PLSQL

实例讲解如何处理CLOB字段的动态PLSQL,第1张

修改CLOB的PL/SQL过程:updateclob create or replace procedure updateclob( table_name in varchar2, field_id in varchar2, field_name in varchar2, v_id in number, v_pos in number, v_clob in varchar2) is lobloc clob; c_clob varchar2(32767); amt binary_integer; pos binary_integer; query_str varchar2(1000); begin pos:=v_pos32766+1; amt := length(v_clob); c_clob:=v_clob; query_str :='select '||field_name||' from '| |table_name||' where '||field_id||'= :id for update '; --initialize buffer with data to be inserted or updated EXECUTE IMMEDIATE query_str INTO lobloc USING v_id; --from pos position, write 32766 varchar2 into lobloc dbms_lobwrite(lobloc, amt, pos, c_clob); commit; exception when others then rollback; end; /具体用法说明: 在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),然后调用以上的过程插入大于2048到32766个字符。 查询CLOB的PL/SQL函数:getclob create or replace function getclob( table_name in varchar2, field_id in varchar2, field_name in varchar2, v_id in number, v_pos in number) return varchar2 is lobloc clob; buffer varchar2(32767); amount number := 2000; offset number := 1; query_str varchar2(1000); begin query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id '; --initialize buffer with data to be found EXECUTE IMMEDIATE query_str INTO lobloc USING v_id; offset:=offset+(v_pos-1)2000; --read 2000 varchar2 from the buffer dbms_lobread(lobloc,amount,offset,buffer); return buffer; exception when no_data_found then return buffer; end; /具体用法说明: 用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual; 可以从CLOB字段中取2000个字符到partstr中,编一个循环可以把partstr组合成dbms_lobgetlength(field_name)长度的目标字符串

java clob是什么,让我们一起了解一下?

CLOB是内置类型,将字符大对象存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用SQL locator实现Clob对象,这意味着CLOB对象包含一个指向SQL CLOB数据的逻辑指针而不是数据本身。

在JAVA如何使用CLOB进行 *** 作?

在绝大多数情况下,有2种方法使用CLOB。

1、相对比较小的,可以用String进行直接 *** 作,把CLOB看成字符串类型即可。

2、如果比较大,可以用 getAsciiStream 或者 getUnicodeStream 以及对应的 setAsciiStream 和 setUnicodeStream 即可。
(1)读取数据:
ResultSet rs = stmtexecuteQuery("SELECT TOP 1  FROM Test1"); rsnext(); Reader reader = rsgetCharacterStream(2);
(2)插入数据:
PreparedStatement pstmt = conprepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (, )"); pstmtsetInt(1, 1); pstmtsetString(2, htmlStr); pstmtexecuteUpdate();
(3)更新数据:
Statement stmt = concreateStatement(); ResultSet rs = stmtexecuteQuery("SELECT  FROM test1"); rsnext(); Clob clob = rsgetClob(2); long pos = clobposition("dog", 1); clobsetString(1, "cat", len, 3); rsupdateClob(2, clob); rsupdateRow();
那么java是如何 *** 作数据库clob字段的?

示例代码如下: package comtestdbclob; import javaioBufferedReader; import javaioIOException; import javaioWriter; import javasqlClob; import javasqlConnection; import javasqlDriverManager; import javasqlPreparedStatement; import javasqlResultSet; import javasqlSQLException; import javasqlStatement; public class ClobTest {undefined private static Connection conn; static {undefined try {undefined ClassforName("oraclejdbcdriverOracleDriver"); conn = DriverManagergetConnection( "jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger"); } catch (ClassNotFoundException e) {undefined eprintStackTrace(); } catch (SQLException e) {undefined eprintStackTrace(); } } public static void main(String[] args) throws SQLException, IOException {undefined testInsert(); testUpdate(); testRead(); } private static void testInsert() throws SQLException {undefined String sql = "insert into test_clob values(1, empty_clob())"; Statement stm = conncreateStatement(); stmexecute(sql); } private static void testUpdate() throws SQLException, IOException {undefined String sql = "select content from test_clob where id = 1 for update"; Statement stm = conncreateStatement(); ResultSet rs = stmexecuteQuery(sql); while (rsnext()) {undefined Clob c = rsgetClob(1); ctruncate(0);// clear Writer w = csetCharacterStream(1);//The first position is 1 wwrite("abc"); wclose(); csetString(clength() + 1, "abc"); conncommit(); } } private static void testRead() throws SQLException, IOException {undefined String sql = "select content from test_clob where id = 1"; PreparedStatement pstm = connprepareStatement(sql); ResultSet rs = pstmexecuteQuery(); while (rsnext()) {undefined Clob clob = rsgetClob("content"); Systemoutprintln("clobgetSubString(1, 2) --> " + clobgetSubString(1, 2)); Systemoutprintln("clobgetSubString(1, (int)cloblength()) --> " + clobgetSubString(1, (int)cloblength())); BufferedReader r = new BufferedReader(clobgetCharacterStream()); String s; while ((s = rreadLine()) != null) {undefined Systemoutprintln(s); } rclose(); } } }

当通过insert语句直接插入大量字符串(主要是html的内容),超过4000字符时候,就会报:
ORA-01489: 字符串连接的结果过长
虽然字段是clob,足以存储,但是通过这种直接插入的时候,因为没有强制指定带插入字符串为clob类型,
oracle会把插入的字符串作为 “字符串类型”处理,由于oracle有最大字符串限制(不超过4000个字符),所以会报错。
解决思路:指定待插入字符串类型为clob,可以使用过程或存储过程
例子:
DECLARE
REALLYBIGTEXTSTRING CLOB := '待插入的海量字符串';
BEGIN
INSERT INTO test_table VALUES('test', REALLYBIGTEXTSTRING, '0');
end ;
/
commit;
这样就可以解决问题。
补充:java的jdk对这种情景有通过l流的方式处理,因此比较方便。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12628378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存