Хранимая процедура Oracle OUT CLOB возвращает слишком маленький буфер строки символов ошибки - PullRequest
0 голосов
/ 26 июня 2018

У меня есть хранимая процедура Oracle, которую я вызываю из приложения.Хранимая процедура будет искать мой параметр, указанный в приложении, запрашивать данные и затем возвращать информационное сообщение в мое приложение.

Однако я получаю сообщение об ошибке

ORA-06502: PL / SQL: ошибка числа или значения: слишком мал буфер строки символов

в строке37, то есть P_INFO, и я здесь использую тип данных CLOB, предположим, что он может поддерживать очень большое количество символов, при условии, что возвращаемая информация превышает 100 000 символов.

create or replace PROCEDURE SimpleProcedure
(
  P_ID  VARCHAR2,
  P_INFO OUT CLOB
) AS
  V_PROJ_ID   VARCHAR2(50);
  V_PROJ_NAME NVARCHAR2(1000);
  V_APP_ID     VARCHAR2(50);
  V_APP_STATUS VARCHAR2(50);
  CURSOR SUB_ATTACH_CURSOR(APP_ID VARCHAR2) IS
    SELECT S.SUBMISSION_ID,
           SA.FILE_ID,
           SA.STATUS_CODE,
           E.FILENAME_TEXT
      FROM SUBM_ATTCHMNT SA
     INNER JOIN SUB_SUBMISSION S
        ON S.SUBMISSION_ID = SA.SUBMISSION_ID
     INNER JOIN SUB_FILE E
        ON E.FILE_ID = SA.FILE_ID
     WHERE S.APP_ID = APP_ID;
BEGIN
  SELECT P.PROJECT_ID,
         P.NAME_TEXT,
         A.APP_ID,
         A.STATUS_CODE
    INTO V_PROJ_ID, V_PROJ_NAME, V_APP_ID, V_APP_STATUS
    FROM SUB_APP A
   INNER JOIN SUB_PROJ P
      ON P.PROJECT_ID = A.PROJECT_ID
   WHERE A.ID = P_ID;
  P_INFO := 'Information:
               Proj id: ' || V_PROJ_ID || ',
               Proj name: ' || V_PROJ_NAME || ',
               App id: ' || V_APP_ID || ',
               App status: ' || V_APP_STATUS || ',';
  FOR SA IN SUB_ATTACH_CURSOR(V_APP_ID) LOOP
    P_INFO := P_INFO || 'Submission id: ' || SA.SUBMISSION_ID ||
                 ',file id: ' || SA.FILE_ID || ', file name: ' ||
                 SA.FILENAME_TEXT || ', file Status: ' ||
                 SA.STATUS_CODE || ' ';
  END LOOP;
END SimpleProcedure;

1 Ответ

0 голосов
/ 26 июня 2018

Попробуйте это так (используя DBMS_LOB.APPEND ):

create or replace PROCEDURE SimpleProcedure(P_ID  VARCHAR2, P_INFO OUT CLOB) AS

  V_PROJ_ID   VARCHAR2(50);
  V_PROJ_NAME NVARCHAR2(1000);
  V_APP_ID     VARCHAR2(50);
  V_APP_STATUS VARCHAR2(50);
  v_SA VARCHAR2(30000); 

  CURSOR SUB_ATTACH_CURSOR(APP_ID VARCHAR2) IS
    SELECT S.SUBMISSION_ID,
           SA.FILE_ID,
           SA.STATUS_CODE,
           E.FILENAME_TEXT
    ...
BEGIN
  SELECT P.PROJECT_ID,
         P.NAME_TEXT,
         A.APP_ID,
         A.STATUS_CODE
     ...    
  P_INFO := 'Information:
               Proj id: ' || V_PROJ_ID || ',
               Proj name: ' || V_PROJ_NAME || ',
               App id: ' || V_APP_ID || ',
               App status: ' || V_APP_STATUS || ',';
  FOR SA IN SUB_ATTACH_CURSOR(V_APP_ID) LOOP
    v_SA := 'Submission id: ' || SA.SUBMISSION_ID ||
                 ',file id: ' || SA.FILE_ID || ', file name: ' ||
                 SA.FILENAME_TEXT || ', file Status: ' ||
                 SA.STATUS_CODE || ' ';
    DBMS_LOB.APPEND(P_INFO, v_SA);
  END LOOP;
END SimpleProcedure;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...