【问题标题】:How to fix Character string buffer too small error in OUT variable in Stored Procedure如何修复存储过程中 OUT 变量中的字符串缓冲区太小错误
【发布时间】:2019-11-17 03:27:28
【问题描述】:

我正在尝试使用 OUT 变量发送 SQL 结果,但收到“ORA-06502: PL/SQL: numeric or value error: string buffer too small”错误,我尝试将 o_sql 从 varchar2 更改为 nvarchar2但仍然有问题,似乎也无法在输入/输出部分将其定义为 varchar2(10000)。 在第一部分,我从 i_In 和 o_sql + o_file 收到了程序调用者的时间,我也删除了异常部分 bcz 没有任何问题。

CREATE OR REPLACE PROCEDURE P_C_CCT_QADATA(i_In      in  varchar2,
    o_sql     out nvarchar2,  --in here i try to change it to varchar2(1000) 
    --but not working and 
    o_File    out varchar2
    )
AS
v_date        DATE;
v_ERRCODE     T_C_CCT_RESULTMSG.code%TYPE;
v_ERRMSG      T_C_CCT_RESULTMSG.MESSAGE%TYPE;
v_month       varchar(2);

Begin

v_date := TO_DATE(i_In,'YYYYMMDDHH24MISS');
select to_char(sysdate, 'MM') into v_month from dual;


o_sql  := 'select t.SERIALNO,
t.CONTACTID,
t.CONTACTCHANNELID,
t.CONTACTCHANNELNAME,
t.CONTACTMODEID,
t.CONTACTMODENAME,
t.SUBCCNO,
t.VDNID,
t.HOSTEDCCID,
t.CALLID,
t.CALLTYPE,
t.LANGUAGETYPEID,
t.LANGUAGETYPENAME,
t.CALLSKILLID,
t.CALLSKILLDESC,
t.CALLERNO,
t.CALLEDNO,
t.SUBSNUMBER,
t.ORGCALLERNO,
t.ORGCALLEDNO,
t.MEDIATYPEID,
t.MEDIATYPENAME,
t.CALLSTARTTIME,
t.CALLDURATION,
t.STAFFID,
t.CUSTCITYID,
t.SERVICECITYID,
t.STAFFCITYID,
t.SUBSCITYID,
t.SUBSNAME,
t.SUBSLEVELID,
t.SUBSLEVELNAME,
t.SUBSBRANDID,
t.SUBSBRANDNAME,
t.SUBSPHONE1,
t.SUBSPHONE2,
t.SUBSFAXNO,
t.SUBSEMAIL,
t.SUBSADDRESS,
t.CUSTID,
t.CUSTNAME,
t.CUSTLEVELID,
t.CUSTLEVELNAME,
t.CUSTBRANDID,
t.CUSTBRANDNAME,
t.CUSTPHONE1,
t.CUSTPHONE2,
t.CUSTFAXNO,
t.CUSTEMAIL,
t.CUSTADDRESS,
t.LINKMODE,
t.LINKMAN,
t.LINKINFO,
t.LINKADDRESS,
t.REMARK,
t.CONTACTSTARTTIME,
t.CONTACTDURATION,
t.PLAYRECORDFLAG,
t.QCFLAG,
t.EVTERID,
t.HAVESERVICEFLAG,
t.INTERCEPTFLAG,
t.STAFFHANGUP,
t.SURVEYTYPEID,
t.USERSATISFY,
t.SATISFYFILEPATH,
t.LISTENFLAG,
t.INNERHELPFLAG,
t.PICKUPSTAFFID,
t.MAINCONTACTFLAG,
t.CALLTRACK,
t.DIGITCODE,
t.EXPFLAG,
t.HASRECORDFILE,
t.ISPROCESSED,
t.TENANTID,
b.FILENAME
from T_CCT_CONTACTDETAIL t, trecordinfo'||v_month||'@icddb b
where  b.CALLID = t.CALLID
and t.CALLSTARTTIME > (sysdate- 8/24)
and t.CALLSTARTTIME <= (sysdate- 2/24))';
o_file := 'CONTACTDETAIL' || TO_CHAR(v_date, 'YYYYMMDDHH');

END P_C_CCT_QADATA;

【问题讨论】:

  • 下面是过程的定义: CREATE OR REPLACE PROCEDURE P_C_CCT_QADATA(i_In in varchar2, o_sql out nvarchar2, --in here I try to change it to varchar2(1000) --but not working and o_File out varchar2 )
  • 你能贴出调用过程P_C_CCT_QADATA的代码吗?
  • @Abra 它只发送格式为 yyyymmddhhmmss 的字符,然后我会将其转换为日期。

标签: oracle stored-procedures plsql procedure


【解决方案1】:

--在这里我尝试将其更改为 varchar2(1000)
--但不工作

PL/SQL 参数没有长度限制。所以varchar2(1000) 不会编译为参数定义。

问题在于调用此过程时分配给o_sql 的变量的大小。这需要足够大以容纳字符串。您的字符串大约有 1330 个字符长,这意味着 varchar2(1000) 对于您的需求来说太短了。

尝试类似:

declare
    l_sql nvarchar2(1600); -- big enough to hold teh output value!
    l_file varchar2(32);
begin
    P_C_CCT_QADATA(i_In   => 'whatever',
                   o_sql  => l_sql, 
                   o_File => l_file);
end;
/

【讨论】:

  • 我是Oracle的新手,我怎么能这样使用?我的意思是我应该在哪个地方插入这段代码?我尝试按以下方式执行但不工作: CREATE OR REPLACE PROCEDURE P_C_CCT_QADATA declare l_sql nvarchar2(1600); l_file varchar2(32);开始 P_C_CCT_QADATA(i_In => varchar2, o_sql => l_sql, o_File => l_file);结尾; /AS v_date DATE; v_ERRCODE T_C_CCT_RESULTMSG.code%TYPE; v_ERRMSG T_C_CCT_RESULTMSG.MESSAGE%TYPE; v_month varchar(2);开始 v_date := TO_DATE(i_In,'YYYYMMDDHH24MISS'); @APC
  • 过程是一段自包含的代码,我们通过从另一个程序调用它来运行它。该调用程序可以是另一个过程、Web 应用程序或 SQL*Plus 或 TOAD 等客户端。我提供的代码是用于调用您的过程的工具。也就是说,您可以从 SQL*Plus 或您正在使用的任何工具运行的外部程序。
【解决方案2】:

问题不在于您的程序,而在于您的程序。转到调用过程的位置,找到作为输出参数传递给过程的变量,并使该变量更大。将其定义为 VARCHAR2(32767),这是 PL/SQL 中可能的最大值,似乎是合理的。

【讨论】:

    【解决方案3】:

    我已将您的代码编译到我的架构中并且我能够执行它,请尝试以下操作:

     declare
    
    p_sql varchar2(5000);
    
    p_File varchar2(5000);
    
     begin
    
        P_C_CCT_QADATA(12412342134,p_sql,p_File);
    
        dbms_output.put_line(p_sql);
    
       end;
    

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2014-02-21
      相关资源
      最近更新 更多