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

oracle ORA-06502:PL/SQL:数字或值错误:大容量绑定:截断绑定,oracle,plsql,cursor,Oracle,Plsql,Cursor,在sys.odcivarchar2list中使用光标大容量收集结果时,我遇到以下错误: ORA-06502:PL/SQL:数字或值错误:大容量绑定:截断绑定 我的循环执行了很多次,没有任何错误,但只针对一个特定的表,我将所有数据收集到varchar2列表中,我得到了这个错误。我使用了以下代码: declare filehandle1 utl_file.file_type; myquery varchar2(4000) := 'select column1 ||''~''|| column

在sys.odcivarchar2list中使用光标大容量收集结果时,我遇到以下错误: ORA-06502:PL/SQL:数字或值错误:大容量绑定:截断绑定 我的循环执行了很多次,没有任何错误,但只针对一个特定的表,我将所有数据收集到varchar2列表中,我得到了这个错误。我使用了以下代码:

declare
  filehandle1 utl_file.file_type;
  myquery varchar2(4000) := 'select column1 ||''~''|| column2 from mytable';
  mycursor sys_refcursor;
  myresults sys.odcivarchar2list;
begin
  filehandle1 := utl_file.fopen ('D42', 'mydata', 'w');
  open mycursor for myquery; 
  loop
   fetch mycursor bulk collect into myresults;
if myresults.count>0 Then
    for idx in myresults.first..myresults.last loop
      utl_file.put_line(filehandle1, myresults(idx));
    end loop;
End if;
    exit when mycursor%notfound;
  end loop;
  close mycursor;
  utl_file.fclose(filehandle1);
end;
这将返回100多个表的结果,但只有一个表崩溃。
提前感谢您的帮助

您需要将每个CLOB值写入一个单独的文件,并将该文件名作为主数据记录的一部分。大概是这样的:

declare
  data_file utl_file.file_type;
  clob_file utl_file.file_type;
  buffer varchar2(32767);
  position pls_integer;
  chars pls_integer;

  myquery varchar2(4000) := 'select column1 ||''~''|| column3, '
    || '''column2_'' || rownum, column2 from mytable';
  mycursor sys_refcursor;
  myresult varchar2(4000);
  myfilename varchar2(120);
  myclob clob;
begin
  data_file := utl_file.fopen ('D42', 'mydata', 'w');
  open mycursor for myquery; 
  loop
    fetch mycursor into myresult, myfilename, myclob;
    exit when mycursor%notfound;
    if myclob is not null and dbms_lob.getlength(myclob) > 0 then
      myresult := myresult ||'~'|| myfilename;
      clob_file := utl_file.fopen ('D42', myfilename, 'w', 32767);
      position := 1;
      chars := 32767;
      while position < dbms_lob.getlength(myclob) loop
        dbms_lob.read(myclob, chars, position, buffer);
        utl_file.put(clob_file, buffer);
        utl_file.fflush(clob_file);
        position := position + chars;
      end loop;
      utl_file.fclose(clob_file);
    end if;
    utl_file.put_line(data_file, myresult);
  end loop;
  close mycursor;
  utl_file.fclose(data_file);
end;
/
。。这将创建包含以下内容的
mydata

1~First
2~Second~column2_2
3~Third~column2_3
以及具有相应CLOB值的文件
column2_2
column2_3

然后,如果使用该数据文件和CLOB文件以及控制文件运行SQL*Loader:

load data
characterset UTF8
truncate
into table mytable2
fields terminated by "~"
trailing nullcols
(
  column1 char(10),
  column3 char(10),
  clob_filename filler char(120),
  column2 lobfile(clob_filename) terminated by EOF
)
。。。新表填充为:

select * from mytable2;

   COLUMN1 COLUMN2                        COLUMN3  
---------- ------------------------------ ----------
         1                                First      
         2 Second CLOB                    Second
         3 Third CLOB                     Third

(我仍然认为您应该使用内置工具、数据泵或只是在两个模式之间内部复制数据,正如前面的问题所讨论的…)

我收到了这个确切的错误,但这是因为我将Ref游标返回的结果存储到集合中的一个字段中,该字段太小,无法存储该值。该字段被定义为VARCHAR2(25个字符),但是我试图在该字段中存储超过25个字符

花了点时间解剖。关键点是缩小错误发生的确切位置,并且当Ref游标将数据提取到我的集合中时,它是正确的

FETCH rc BULK COLLECT进入[collection]


希望这对某人有所帮助。

可能是因为上一个问题中讨论的
clob
列。但我很想看到这一点得到证实。@Alex。。如果我将clob转换为char并将结果写入文件。。既然您正确地提到了数据可能需要特殊处理,那么sqlloader将如何尝试输入数据呢?我相信您需要将每个
clob
写入一个单独的文件中,然后SQL*Loader可以引用它;如前所示。但我没试过。@alex。。我看了你上面提供的那篇文章。。我想问您“数据文件中的文件名列被标记为填充符,因此它们不会加载到表中,但它们在LOB文件定义中用于标识LOB信息的位置。”我真的需要这些列吗?我将在数据文件和加载程序的控制文件中写入所有内容,我将添加由EOF终止的clob_内容LOBFILE,因为在调用加载程序时,我通过命令中的参数为控制和数据提供参数。列定义的上述语句是否正确?每个LOB值都必须位于其自己的文件中。如果您的表有100行,那么您将有100个LOB文件,并且您已经创建的文件中的其余数据都指向特定于行的LOB文件名。因此,必须在数据文件中包含LOB文件名;但是相关的LOB已加载到位。非常感谢alex的帮助和支持。这是非常有帮助的,我现在唯一关心的是,毕竟这是你在最后所说的。也许对这个表使用带有clob列的数据泵实用程序,只导出和导入数据会更有效。但是我可以告诉你,使用sqlloader让我有机会在游标函数和写入文件(包括linuxOn的shell脚本)方面更加丰富我的知识。这一次,我可能会划清界限,使用数据泵,因为当您必须导出数千行具有clob列时会发生什么情况。。最终将写入数千个文件,然后导入数千个文件。因此,正如您所建议的,数据泵在这张表上会更有效
select * from mytable2;

   COLUMN1 COLUMN2                        COLUMN3  
---------- ------------------------------ ----------
         1                                First      
         2 Second CLOB                    Second
         3 Third CLOB                     Third