如何在不修改数据库模式的情况下仅使用 PL/SQL 更新具有大值的 CLOB?
Posted
技术标签:
【中文标题】如何在不修改数据库模式的情况下仅使用 PL/SQL 更新具有大值的 CLOB?【英文标题】:How do you UPDATE a CLOB with large values using only PL/SQL without modifying the DB schema? 【发布时间】:2014-04-10 15:47:04 【问题描述】:假设您有一个无法修改的 Oracle 10g (10.2.0.3) 数据库方案(因为它不受您的控制),并且您想将大字符串(100k+ 个字符)插入某些 CLOB 字段以使用 PL 进行测试/SQL(更准确地说:可以通过批处理文件通过 sqlplus 执行的 SQL 脚本)。有可能吗?
我找到了几个使用 .NET、oci 等或创建存储过程的解决方案,但我需要一个可行的解决方案,例如从 SQL Developer 内部,无需对数据库方案进行任何修改,例如添加存储过程等。
我已经尝试过多种方式,例如
-- Disclaimer: I typed this by heart just for SO, there might be syntax errors
DECLARE
v_test CLOB;
v_clob_to_update CLOB;
BEGIN
-- Note: rpad only works up to 32755 or something
v_test := to_clob( rpad( 'This is a very long string', 30000, '.' ) );
v_test := v_test || to_clob( rpad( '.', 30000, '.' ) );
SELECT my_clob_field INTO v_clob_to_update FROM my_table WHERE my_id = 1234 FOR UPDATE;
DBMS_LOB.WRITE( v_clob_to_update, LENGTH( v_test ), 1, v_test );
END;
但我总是收到“字符串文字太长”或“数字或值错误”消息。
是否可以在尊重我的限制的同时做到这一点?
【问题讨论】:
在循环中使用DBMS_LOB.WRITE()
或WRITEAPPEND()
怎么样?或者,您可以使用LOADFROMFILE()
。
很多例子here和here
【参考方案1】:
如果您使用dbms_lob
包写信给v_test
,您应该可以克服遇到的错误。字符串连接运算符 ||
尚未重载以处理 LOB
数据。
换句话说,而不是
v_test := v_test || to_clob( rpad( '.', 30000, '.' ) );
你可能想要
dbms_lob.writeAppend( v_test, 30000, rpad( '.', 30000, '.' ) );
【讨论】:
看起来很有希望,我今天晚些时候试试以上是关于如何在不修改数据库模式的情况下仅使用 PL/SQL 更新具有大值的 CLOB?的主要内容,如果未能解决你的问题,请参考以下文章
在不使用 UTL_FILE 的情况下从 PL/SQL 中的文件读取/写入数据