프로시저에서 다른 프로시저 호출 방법 0 2 2,455

by 지리산 [PL/SQL] 커서 프로시저 PL/SQL [2022.01.18 16:03:07]


예를 들어 A, B 이렇게 2개의 프로시저가 있습니다.

A 프로시저는 B테이블의 결과을 받아서 GLOBAL TEMPORARY TABLE에 입력해서 조작후 최종 결과를 조회 하는 기능

B 프로시저는 원천 데이터를 조작해서, 조회하는 기능

/* 임시 테이블 */

CREATE GLOBAL TEMPORARY TABLE TT_TB_TMP 
(
TABLE_NAME VARCHAR2(200) 
,COLUMN_NAME VARCHAR2(200) 

ON COMMIT DELETE ROWS 
NOPARALLEL;

/* 프로시저 B(SP_TEST_H2)*/

create or replace PROCEDURE SP_TEST_H2
(
  p_TBL_NAME IN VARCHAR
)
AS 
    v_cursor SYS_REFCURSOR;
BEGIN
    OPEN  v_cursor FOR
        SELECT TABLE_NAME, COLUMN_NAME 
          FROM ALL_TAB_COLUMNS
         WHERE TABLE_NAME = 'ALL_XML_SCHEMAS';  -- p_TBL_NAME
    DBMS_SQL.RETURN_RESULT(v_cursor);
    
END SP_TEST_H2;

/* 프로시저 A(SP_TEST_H1)*/

create or replace PROCEDURE SP_TEST_H1
(
  p_TBL_NAME IN VARCHAR
)
AS 
     v_cursor SYS_REFCURSOR;
BEGIN

    
    DECLARE
      cv_ins SYS_REFCURSOR;
      v_temp TT_TB_TMP%ROWTYPE;
   
    BEGIN
      cv_ins := SP_TEST_H2('XXX');     
      LOOP
         FETCH cv_ins INTO v_temp;
         EXIT WHEN cv_ins%NOTFOUND;
         INSERT INTO TT_TB_TMP VALUES v_temp;
      END LOOP;
      CLOSE cv_ins;

       /*
      OPEN  v_cursor FOR
        SELECT * FROM TT_TB_TMP;
        DBMS_SQL.RETURN_RESULT(v_cursor);
      */


    END;

END SP_TEST_H1;

 

A 프로시저 실행시 다음과 같은 컴파일 오류가 발생합니다.

-- PLS-00222: 'SP_TEST_H2'라는 이름의 함수는 범위 내에 존재하지 않습니다

뭘 잘못 한걸가요?

by 마농 [2022.01.19 16:43:25]
-- 1. 프로시저에 커서형 Out 변수 선언 --
CREATE OR REPLACE PROCEDURE sp_test_h2
( p_TBL_NAME IN VARCHAR2
, p_cursor OUT SYS_REFCURSOR
)
AS 
BEGIN
    OPEN p_cursor FOR
    ...
END;
/

-- 2. 호출시 커서형 변수 포함하여 호출 --
DECLARE
    cv_ins SYS_REFCURSOR;
BEGIN
    sp_test_h2('XXX', cv_ins);
    ...
END;
/

 


by 지리산 [2022.01.20 13:09:56]

감사합니다.

그런데, 오라클은 커서형 변수 선언을 하지 않으면 호출은 안되는 모양이군요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입