ORA - 06502:PL/SQL:数字或值错误:批量绑定:截断绑定

Posted

技术标签:

【中文标题】ORA - 06502:PL/SQL:数字或值错误:批量绑定:截断绑定【英文标题】:ORA - 06502:PL/SQL : Numeric or Value Error:Bulk Bind : truncated Bind 【发布时间】:2014-03-11 13:31:55 【问题描述】:

这是我的存储过程:

CREATE OR REPLACE PACKAGE BS_SAMPLES AS
  TYPE type_memo_raw IS TABLE OF LONG RAW;
  PROCEDURE MIGRATE_MEMO_TO_MEMO_CLOB(RMEMO OUT  type_memo_raw);
END BS_SAMPLES;

CREATE OR REPLACE PACKAGE BODY BS_SAMPLES AS
  PROCEDURE MIGRATE_MEMO_TO_MEMO_CLOB (RMEMO OUT  type_memo_raw)
  AS
  ls_memo_raw      type_memo_raw;
  BEGIN

   SELECT MR.MEMO_DATA BULK COLLECT
        INTO  ls_memo_raw
        FROM V3_TO_V4_MEMO A, MEMO_RTF MR
       WHERE A.MEMO_ID = MR.MEMO_ID;     

      RMEMO :=ls_memo_raw;
   End MIGRATE_MEMO_TO_MEMO_CLOB;
END BS_SAMPLES;

当我尝试执行程序时,我收到以下错误:

ORA - 06502:PL/SQL : Numeric or Value Error:Bulk Bind : truncated Bind

使用 Oracle 版本:Oracle Database 11g Release 11.2.0.2.0 - 64bit Production

表格备忘录_rtf


Name             Null          Type
MEMO_ID          NOT NULL      NUMBER(10)
MEMO_DATA                      LONG RAW()

表 V3_TO_V4_MEMO


Name             Null         Type    
MEMO_ID                       NUMBER(10) 

【问题讨论】:

你能发布你的表的 DDL 吗? 【参考方案1】:

PL/SQL 中的 LONG ROW 和 SQL 是有区别的。

在 SQL 中:

http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm

“可变长度的原始二进制数据,最大为 2 GB。”

在 PL/SQL 中:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/datatypes.htm#i10924

" 您使用 LONG RAW 数据类型来存储二进制数据或字节字符串。 LONG RAW 数据类似于 LONG 数据,只是 LONG RAW 数据不被 PL/SQL 解释。 LONG RAW 值的最大大小为 32760 字节。 "

请看下面的例子:

SQL> desc t
 Имя                                       Пусто?   Тип
 ----------------------------------------- -------- ----------------------------
 X                                                  LONG RAW

CREATE OR REPLACE PACKAGE BS_SAMPLES AS
  TYPE type_memo_raw IS TABLE OF LONG RAW;
  PROCEDURE MIGRATE_MEMO_TO_MEMO_CLOB(RMEMO OUT  type_memo_raw);
END BS_SAMPLES;

CREATE OR REPLACE PACKAGE BODY BS_SAMPLES AS
  PROCEDURE MIGRATE_MEMO_TO_MEMO_CLOB (RMEMO OUT  type_memo_raw)
  AS
  ls_memo_raw      type_memo_raw;
  BEGIN

        SELECT t.x BULK COLLECT
        INTO ls_memo_raw 
        FROM t;     

        RMEMO := ls_memo_raw;
   End MIGRATE_MEMO_TO_MEMO_CLOB;
END BS_SAMPLES;

好的,现在我在 T 表中添加 1 行并将大约 90K 大小的图像(使用 PL/SQL Developer 工具)放入 X 列。

SQL> declare
  2   a BS_SAMPLES.type_memo_raw;
  3  begin
  4     BS_SAMPLES.MIGRATE_MEMO_TO_MEMO_CLOB(a);
  5  end;
  6  /
declare
*
error in line 1:
ORA-06502: PL/SQL: : Bulk Bind: Truncated Bind 
ORA-06512: at  "SCOTT.BS_SAMPLES", line 7 
ORA-06512: at  line 4 


SQL> alter table t modify (x blob);

SQL> select dbms_lob.getlength(x) a from t;

                             a
------------------------------                                                  
                         90025 

好的,现在让我们重新创建表 T 并添加大约 29K 大小的图像 - 一切都可以:

SQL> declare
  2   a BS_SAMPLES.type_memo_raw;
  3  begin
  4     BS_SAMPLES.MIGRATE_MEMO_TO_MEMO_CLOB(a);
  5  end;
  6  /

PL/SQL procedure completed.

SQL> alter table t modify (x blob);

SQL> select dbms_lob.getlength(x) a from t;

                             a                                                  
------------------------------                                                  
                         25554 

所以 LONG ROW 应该转换为 BLOB,这是处理它的最佳方式。

【讨论】:

以上是关于ORA - 06502:PL/SQL:数字或值错误:批量绑定:截断绑定的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误

ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值

ORA-06502: PL/SQL: 数字或值错误: 数字精度太大

获取 ORA-06502:PL/SQL:数字或值错误:SQL 触发器中的字符到数字转换错误

oracle ORA-06502:PL/SQL:数字或值错误:批量绑定:截断绑定

ORA - 06502:PL/SQL:数字或值错误:批量绑定:截断绑定