如何在不修改数据库模式的情况下仅使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不提交页面的情况下刷新 PL/SQL 动态内容区域

在不使用 UTL_FILE 的情况下从 PL/SQL 中的文件读取/写入数据

在不创建存储过程的情况下将 PL/SQL 发送到 Oracle

在不借助 PL/SQL 的情况下从第二个表中查找相关值

如何在不使用 LOOP 的情况下计算取决于先前值的当前值?

如何使用 pl/sql 脚本导出 oracle sql 开发人员表模式?