【发布时间】:2014-03-23 18:54:19
【问题描述】:
当使用游标批量收集 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 多个表的结果,但只有 1 个表崩溃。 提前感谢您的帮助
【问题讨论】:
-
可能是因为
clob列,如上一个问题所述。有兴趣看到这一点得到证实。 -
@Alex.. 如果我将 clob 转换为 char 并将结果写入文件.. 那么 sqlloader 将如何尝试输入数据,因为您正确提到它可能需要特殊处理?
-
我相信您需要将每个
clob写入一个单独的文件,以便 SQL*Loader 然后可以引用该文件;如之前的artice I linked to 所示。不过我没试过。 -
@alex.. 我看了你上面提供的文章.. 我想问你“数据文件中的文件名列被标记为 FILLER,所以它们没有加载到表中,但它们是在 LOBFILE 定义中用于标识 LOB 信息的位置。”我真的需要这些专栏吗?我将在数据文件和加载程序的控制文件中写入所有内容,我将添加 clob_content LOBFILE TERMINATED BY EOF,因为在调用加载程序时,我通过命令中的参数提供控制和数据。上述列定义的说法正确吗?
-
每个 LOB 值都必须在其自己的文件中。如果您的表有 100 行,那么您将有 100 个 LOB 文件,以及您已经创建的文件中的其余数据,该文件中的每一行都指向特定于行的 LOB 文件名。所以你必须在数据文件中有那个 LOB 文件名;但相关的 LOB 已加载到位。