【问题标题】:How do you UPDATE a CLOB with large values using only PL/SQL without modifying the DB schema?如何在不修改数据库模式的情况下仅使用 PL/SQL 更新具有大值的 CLOB?
【发布时间】: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()
  • 很多例子herehere

标签: oracle plsql oracle-sqldeveloper sqlplus


【解决方案1】:

如果您使用dbms_lob 包写信给v_test,您应该可以克服遇到的错误。字符串连接运算符 || 尚未重载以处理 LOB 数据。

换句话说,而不是

v_test := v_test || to_clob( rpad( '.', 30000, '.' ) );

你可能想要

dbms_lob.writeAppend( v_test, 30000, rpad( '.', 30000, '.' ) );

【讨论】:

  • 看起来很有希望,我今天晚些时候试试
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 2012-08-08
  • 2019-11-09
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
相关资源
最近更新 更多