Как исправить слишком маленькую ошибку символьного буфера в переменной OUT в хранимой процедуре - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь использовать переменную OUT для отправки результата SQL, но я получил сообщение «ORA-06502: PL / SQL: ошибка числа или значения: слишком мал символьный буфер строки», я пытаюсь изменить 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;

Ответы [ 2 ]

3 голосов
/ 07 июля 2019

- здесь я пытаюсь изменить его на 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;
/
1 голос
/ 07 июля 2019

Проблема не в вашей процедуре, а в том, что она вызывает вашу процедуру.Перейдите туда, откуда вызывается ваша процедура, найдите переменную, которая передается вашей процедуре в качестве выходного параметра, и увеличьте ее.Определение его как VARCHAR2(32767), максимально возможного в PL / SQL, кажется разумным.

Удачи.

...