【问题标题】:VARCHAR2(32767) not able to handle strings in stored procedureVARCHAR2(32767) 无法处理存储过程中的字符串
【发布时间】:2020-07-24 03:27:07
【问题描述】:

我正在使用游标连接字符串(以形成稍后执行的查询)。在这里,将形成的查询将比 VARCHAR2(32767) 可以处理的要大得多。因此,我在 proc 执行时遇到错误 - ORA-06502: PL/SQL: numeric or value error: string buffer too small。

我也使用了 CLOB 数据类型,但出现错误 ORA-06502: PL/SQL: numeric or value error。

我的代码如下:

CREATE OR REPLACE PROCEDURE sp_Market
IS
   Names VARCHAR2(32767);    
BEGIN
   DECLARE CURSOR cur IS  ('Select ID, Order_of, field_name  
   FROM   pld_medicare_config');
   BEGIN       
   FOR i IN cur
       LOOP
           Names := Names ||  i.sqql;
       END LOOP;    
   dbms_output.put_line(Names);
   END;   
END sp_Market;

如何处理我的查询字符串以及完成任务的数据类型是什么?

【问题讨论】:

标签: oracle stored-procedures plsql


【解决方案1】:

CLOB 可以(据我所知);我怀疑您存储的查询有 大。

从过程中删除dbms_output.put_line调用;我怀疑这是引发错误的那个。

【讨论】:

  • 从 proc 中删除 dbms_output.put_line 后,有没有办法让我看到 Names 的内容。
  • 是的。选择它。
【解决方案2】:

我不确定您是如何遇到任何运行时错误的,因为您的程序无法编译。

有效的 PL/SQL 版本如下所示:

create or replace procedure sp_market is
    names varchar2(32767);
begin
    for r in (
        select id, order_of, field_name
        from   pld_medicare_config
    )
    loop
        names := names || ' ' || r.field_name;
    end loop;

    names := ltrim(names);

    dbms_output.put_line(names);
end sp_market;

如果names 需要更长,请将数据类型更改为clob

【讨论】:

    【解决方案3】:

    使用CLOB 数据类型并使用dbms_lob.writeappend 过程附加数据。 This is the reference (Oracle 18c)。

    错误可能源于dbms_output.put_line 调用。该过程仅针对varchar2 参数定义,这意味着在调用期间会发生隐式转换。如果 clob 内容超过 32767 个字符/字节,它将失败。

    或者,您可以在varchar2(4000) 上声明一个集合并按顺序填充集合元素:

    CREATE OR REPLACE PROCEDURE sp_Market
    IS
       TYPE tLongString IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
       cNames  tLongString;    
    BEGIN
       DECLARE CURSOR cur IS Select ID, Order_of, field_name, sqql FROM pld_medicare_config;
       BEGIN       
       FOR i IN cur
           LOOP
               cNames(cNames.COUNT+1) := i.sqql;
           END LOOP;    
       END;   
    END sp_Market;
    

    注意

    修改后的代码,现在可以编译了。

    【讨论】:

    • 那不会编译。 cur 需要是静态 SQL 语句,而不是字符串(并且不在括号中),并且 sqql 未定义且对其的赋值缺少分号。
    • @WilliamRobertson 感谢您指出缺少的 ';'和光标问题。该代码尚未经过测试。我将删除此答案并整理一下
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 2012-07-20
    • 2015-12-30
    • 1970-01-01
    • 2013-10-13
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多