在 PL/SQL 中插入 clob 数据时出错

Posted

技术标签:

【中文标题】在 PL/SQL 中插入 clob 数据时出错【英文标题】:Error while inserting a clob data in PL/SQL 【发布时间】:2017-04-28 20:02:51 【问题描述】:

我有一个存储过程,它接受字符串作为参数,并将它分配给一个 clob 变量并在插入查询中使用它。

存储过程-

CREATE OR REPLACE PROCEDURE INSERTPROC(my_data VARCHAR2)   
AS
  my_clob clob;
BEGIN         
      my_clob := my_data; 
      INSERT INTO MYTABLE(MYCLOBCOL) values (my_clob);     
COMMIT;
END;

但是在插入大量数据时,它会抛出以下错误。

java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

我将程序更改为以下,但我仍然觉得它有效,

CREATE OR REPLACE PROCEDURE INSERTPROC(my_data VARCHAR2)   
    AS
      my_clob clob;
    BEGIN         
          --my_clob := my_data; 
          SELECT CONCAT(my_clob, my_data) INTO my_clob FROM DUAL;
          INSERT INTO MYTABLE(MYCLOBCOL) values (my_clob);     
    COMMIT;
    END;

【问题讨论】:

对于大块(即 > 32k),您应该使用 dbms_lob 包,过程 dbms_lob.append。 错误不是来自程序内部的代码;它来自调用 to 过程,因为您传递的字符串值(希望作为绑定变量)大于 varchar2 参数允许的 32k。 【参考方案1】:

上述两个 cmets 是否有效取决于 Oracle 的版本和用于调用该过程的编程语言。我使用 VB.NET (VS 2013) 进行编码,在存储大型文本数据时,我使用 CLOB 作为调用存储过程和存储过程本身的参数类型。假设java调用可以使用CLOB类型,把过程改成:

CREATE OR REPLACE PROCEDURE INSERTPROC(my_data CLOB)   
AS
BEGIN         
      INSERT INTO MYTABLE(MYCLOBCOL) values (my_data);     
COMMIT;
END;

Varchar2 限制为 4000 个字符,CLOB 限制为 2gb,具体取决于数据库版本。

【讨论】:

以上是关于在 PL/SQL 中插入 clob 数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在不修改数据库模式的情况下仅使用 PL/SQL 更新具有大值的 CLOB?

在 PL/SQL 中将数据从文本文件复制到 CLOB

如何在调试 PL SQL 脚本时获得 clob 的全部价值

PL/SQL:clob 字符串中的动态查询。如何打开游标?

PL/SQL 解析 clob 数据

将 BLOB/CLOB 作为参数传递给 PL/SQL 函数