как получить вывод внутренней процедуры в oracle - PullRequest
0 голосов
/ 14 мая 2019

У меня есть процедура, вызывающая другую процедуру. если я вызываю внутреннюю процедуру самостоятельно, я могу получить вывод. но если я использую внешнюю процедуру для вызова внутренней процедуры, я не могу получить вывод.

внешняя процедура

PROCEDURE APPLY_EXEMPTION_BIDIR_BY_ID (
  O_ERRORCODE OUT NUMBER,
  O_ERRORTEXT OUT VARCHAR2,
  O_SPA OUT VARCHAR2,
  O_SPN OUT VARCHAR2,
  O_FPA OUT VARCHAR2,
  O_FPN OUT VARCHAR2,
  I_CMID IN NUMBER
)
AS
  CMCount NUMBER DEFAULT 0;
  CMNotFound EXCEPTION;
BEGIN

  SELECT COUNT(*) INTO CMCount FROM CCP.v_comms_matrices WHERE id = I_CMID;
  IF(CMCount = 0) THEN
    RAISE CMNotFound;
  END IF;

  DECLARE
  O_SPAI VARCHAR(32);
  CURSOR flow_cursor
  IS
    SELECT id
    FROM comms_matrix_data
    WHERE comms_matrix_id = I_CMID
        AND fpa = 'yyy'
        AND fpn = 'xxx'
        AND ROWNUM <= 5;
  BEGIN
    FOR flow_row IN flow_cursor LOOP
      O_SPAI := '';
      O_ERRORCODE := '';
      O_ERRORTEXT := '';
      O_SPA := '';
      O_SPN := '';
      O_FPA := '';
      O_FPN := '';
      CHECK_EXEMPTION_SECURITY_BY_ID(O_ERRORCODE, O_ERRORTEXT, O_SPAI, O_SPN, O_FPA, O_FPN, flow_row.ID);
      dbms_output.put_line('ERRORCODE ' || O_ERRORCODE || ' ERRORTEXT ' || O_ERRORTEXT || ' SPA ' || O_SPAI || ' SPN ' || O_SPN || ' FPA ' || O_FPA || ' FPN ' || O_FPN || ' flow_row.ID ' || flow_row.ID);
    END LOOP;
  END;

  COMMIT;

  O_ERRORCODE := 0;
  O_ERRORTEXT := 'Success';
EXCEPTION
WHEN CMNotFound THEN
  O_Errorcode := 101;
  O_Errortext := 'Comms Matrix not found';
WHEN OTHERS THEN
  O_Errorcode := SQLCODE;
  O_Errortext := SQLERRM;
END;

внутренняя процедура

Это работает, когда я называю это само по себе. я могу успешно получить вывод.

PROCEDURE CHECK_EXEMPTION_SECURITY_BY_ID (
  O_ERRORCODE OUT NUMBER,
  O_ERRORTEXT OUT VARCHAR2,
  O_SPA OUT VARCHAR2,
  O_SPN OUT VARCHAR2,
  O_FPA OUT VARCHAR2,
  O_FPN OUT VARCHAR2,
  I_FLOWID IN NUMBER
)
AS
  FlowCount NUMBER DEFAULT 0;
  FlowNotFound EXCEPTION;
BEGIN
  O_SPA := '';
  O_SPN := '';
  O_FPA := '';
  O_FPN := '';

  SELECT COUNT(*) INTO FlowCount FROM CCP.comms_matrix_data WHERE id = I_FLOWID;
  IF(FlowCount = 0) THEN
    RAISE FlowNotFound;
  END IF;

  DECLARE
  CURSOR flow_cursor
  IS
  SELECT
  t3.service_id
  ,t3.comms_matrix_id
  ,t4.exemption_id
  ,t4.id
  ,t2.id FLOW_ID
  ,t3.updated_by
  ,t4.soct1_1
  ,t4.soct1_2
  ,t4.soct2_1
  ,t4.soct2_2
  ,t4.soct3_1
  ,t4.soct3_2
  ,t4.soct4_1
  ,t4.soct4_2
  ,t4.s_seczone
  ,t4.s_netzone
  ,t4.s_loczone
  ,t4.doct1_1
  ,t4.doct1_2
  ,t4.doct2_1
  ,t4.doct2_2
  ,t4.doct3_1
  ,t4.doct3_2
  ,t4.doct4_1
  ,t4.doct4_2
  ,t4.d_seczone
  ,t4.d_netzone
  ,t4.d_loczone
  ,t4.protocol
  ,t4.ports
  ,NVL(TO_CHAR(t3.expiry_date), 'Forever') EXPIRY_DATE
  FROM CCP.comms_matrices t1
  INNER JOIN CCP.comms_matrix_data t2 ON (t1.id = t2.comms_matrix_id)
  INNER JOIN CCP.v_exemptions_group t3
    ON ((t3.service_id = t1.service_id) OR (t3.service_id IS NULL)) 
    AND ((t3.comms_matrix_id = t1.id) OR (t3.comms_matrix_id IS NULL))
    AND (t3.status = 'Processed')
    AND ((t3.expiry_date IS NULL) OR (t3.expiry_date <= SYSTIMESTAMP))
  INNER JOIN CCP.v_exemption_policies t4 
    ON (t3.id = t4.exemption_id)
    AND (
      (
            ((t2.src_soct1 <= t4.soct1_1) AND (t2.src_eoct1 <= t4.soct1_2))
        AND ((t2.src_soct2 <= t4.soct2_1) AND (t2.src_eoct2 <= t4.soct2_2))
        AND ((t2.src_soct3 <= t4.soct3_1) AND (t2.src_eoct3 <= t4.soct3_2))
        AND ((t2.src_soct4 <= t4.soct4_1) AND (t2.src_eoct4 <= t4.soct4_2))
      ) OR (
        (t2.src_seczone = t4.s_seczone)
        AND ((t2.src_netzone = t4.s_netzone) OR (t4.s_netzone IS NULL))
        AND ((t2.src_loczone = t4.s_loczone) AND (t4.s_netzone IS NOT NULL) OR (t4.s_loczone IS NULL))
      )
    )
    AND (
      (
            ((t2.dst_soct1 <= t4.doct1_1) AND (t2.dst_eoct1 <= t4.doct1_2))
        AND ((t2.dst_soct2 <= t4.doct2_1) AND (t2.dst_eoct2 <= t4.doct2_2))
        AND ((t2.dst_soct3 <= t4.doct3_1) AND (t2.dst_eoct3 <= t4.doct3_2))
        AND ((t2.dst_soct4 <= t4.doct4_1) AND (t2.dst_eoct4 <= t4.doct4_2))
      ) OR (
        (t2.dst_seczone = t4.d_seczone)
        AND ((t2.dst_netzone = t4.d_netzone) OR (t4.d_netzone IS NULL))
        AND ((t2.dst_loczone = t4.d_loczone) AND (t4.d_netzone IS NOT NULL) OR (t4.d_loczone IS NULL))
      )
    )
    AND (
      ((t4.protocol = t2.protocol) AND (t4.ports = t2.ports))
      OR ((t4.protocol = t2.protocol) AND ((t4.ports = t2.ports) OR (t4.ports IS NULL)))
    )
  WHERE (t2.id = I_FLOWID);
  BEGIN
    FOR flow_row IN flow_cursor LOOP
      O_SPA := 'Exemption';
      O_SPN := 'Exemption #' || flow_row.EXEMPTION_ID || '.' || flow_row.ID || ' - Approved by ' || flow_row.UPDATED_BY || ' until ' || flow_row.EXPIRY_DATE || ' (Note: flow id #' || flow_row.FLOW_ID || ')';
      O_FPA := 'Exemption';
      O_FPN := 'Exemption #' || flow_row.EXEMPTION_ID || '.' || flow_row.ID || ' - Approved by ' || flow_row.UPDATED_BY || ' until ' || flow_row.EXPIRY_DATE || ' (Note: flow id #' || flow_row.FLOW_ID || ')';
    END LOOP;

    --CLOSE flow_cursor;
  END;

  COMMIT;

  O_ERRORCODE := 0;
  O_ERRORTEXT := 'Success';

EXCEPTION
WHEN FlowNotFound THEN
  O_Errorcode := 101;
  O_Errortext := 'Flow not found';
WHEN OTHERS THEN
  O_Errorcode := SQLCODE;
  O_Errortext := SQLERRM;
END;

Я использую следующее для запуска этого в sql developer для вызова внешней процедуры

DECLARE
    O_ERRORCODE NUMBER;
    O_ERRORTEXT VARCHAR2(2000);
    O_SPA VARCHAR(32);
    O_SPN VARCHAR(255);
    O_FPA VARCHAR(32);
    O_FPN VARCHAR(255);
  BEGIN


 pkgccpcm.APPLY_EXEMPTION_BIDIR_BY_ID(O_ERRORCODE, O_ERRORTEXT, O_SPA, O_SPN, O_FPA, O_FPN, 79087);

 dbms_output.put_line('');
    dbms_output.put_line('ErrorCode: ' || O_ERRORCODE);
    dbms_output.put_line('ErrorText: ' || O_ERRORTEXT);
    dbms_output.put_line('SPA: ' || O_SPA);
    dbms_output.put_line('SPN: ' || O_SPN);
    dbms_output.put_line('FPA: ' || O_FPA);
    dbms_output.put_line('FPN: ' || O_FPN);
    dbms_output.put_line('');
  END;

Это выход из системы, который я получаю в sql developer

ERRORCODE 0 ERRORTEXT Success SPA  SPN  FPA  FPN  flow_row.ID 12521471
ERRORCODE 0 ERRORTEXT Success SPA  SPN  FPA  FPN  flow_row.ID 12521465
ERRORCODE 0 ERRORTEXT Success SPA  SPN  FPA  FPN  flow_row.ID 12521333
ERRORCODE 0 ERRORTEXT Success SPA  SPN  FPA  FPN  flow_row.ID 12521339
ERRORCODE 0 ERRORTEXT Success SPA  SPN  FPA  FPN  flow_row.ID 12521669

ErrorCode: 0
ErrorText: Success
SPA: 
SPN: 
FPA: 
FPN: 
...