【问题标题】:How to pass a parameter of CLOB type to Oracle stored procedure which is having 100k+ length string?如何将 CLOB 类型的参数传递给具有 100k+ 长度字符串的 Oracle 存储过程?
【发布时间】:2020-12-25 14:24:50
【问题描述】:
 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: numeric or value error\nORA-06512: at

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

【问题讨论】:

标签: oracle plsql oracle12c


【解决方案1】:

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

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;

【讨论】:

  • 这与打印或显示 CLOB 值无关。它是关于将具有更大值的 CLOB 类型的值传递给存储过程
  • 你应该已经解释过了。您的代码没有这样说,因为在您的示例中,您使用的是 dbms_output.put_line,它对输入参数的 varchar2 进行了隐式转换。那么,您想将输入参数传递给可能是大于 100K 的 clob 的过程吗?
  • 是的,我想作为输入参数传递给长度为 100k+ 的过程
  • 那么,你想用它做什么??这是给你答案的主要问题
【解决方案2】:

您可以像其他数据类型 (on 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

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2017-11-10
    • 2016-06-14
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多