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

时间:2020-09-07 07:15:39

标签: oracle plsql oracle12c

 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数据类型的容量?

2 个答案:

答案 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;
相关问题