Create procedure p(p1 clob) as
(
##code goes here..
);
exec p('100k+ length string...');
当我尝试使用长度超过100k的字符串执行上述过程时,它会抛出ORA-20002:-20002:ORA-20002:-6502:ORA-06502:PL / SQL:数字或值错误\ nORA-06512:at
如何将值传递给存储过程? 是否需要增加db_block_size来增加CLOB数据类型的容量?
答案 0 :(得分:2)
您可以将Clob传递给过程,就像其他数据类型(on db<>fiddle)一样:
create or replace procedure p (p1 clob) as
begin
dbms_output.put_line ('clob len='||length (p1));
end;
/
declare
c clob := '123';
begin
for i in 1..4 loop
dbms_lob.append (c, rpad ('A', 32767, 'A')); end loop;
p (c);
end;
/
clob len = 131071
答案 1 :(得分:0)
我认为您错误地认为put_line
的过程dbms_output
可以存储什么CLOB数据类型
DBMS_OUTPUT.PUT_LINE ( item IN VARCHAR2);
该项目是varchar2对象。因此,如果要输出的Clob输出大于varchar的限制,则需要创建另一种代码。就我而言,我始终使用以下代码来打印Clob列:
create or replace procedure print_clob_to_output (p_clob in clob)
is
l_offset pls_integer := 1;
l_chars pls_integer;
begin
loop
exit when l_offset > dbms_lob.getlength(p_clob);
l_chars := dbms_lob.instr(p_clob, chr(10), l_offset, 1);
if l_chars is null or l_chars = 0 then
l_chars := dbms_lob.getlength(p_clob) + 1;
end if;
dbms_output.put_line(dbms_lob.substr(p_clob, l_chars - l_offset, l_offset));
l_offset := l_chars + 1;
end loop;
end print_clob_to_output;