如何将CLOB类型的参数传递给长度超过100k的Oracle存储过程


Create procedure p(p1 clob) as 
(
##code goes here..
);
exec p('100k+ length string...');

当我用100k以上的字符串尝试上述过程时,它正在抛出ORA-2002:-20002:ORA-2002:ORA-06502:PL/SQL:数值或值错误\nORA-06512:在

我们如何将值传递给存储过程?我们是否需要增加db_block_size来增加CLOB数据类型的容量?

您可以像其他数据类型一样(在db<>fiddle上(将clob传递给过程:

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

我认为您弄错了CLOB数据类型可以用dbms_output的过程put_line存储的内容

DBMS_OUTPUT.PUT_LINE ( item IN VARCHAR2);

该项是varchar2对象。因此,如果要打印大于varchar限制的clob的输出,则需要创建不同类型的代码。在我的情况下,我总是使用以下代码来打印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;

最新更新