oracle 프로시저 내 커서 문의 드립니다. 0 4 2,900

by 아야세 [PL/SQL] oracle cursor [2022.02.23 15:44:47]


create or replace PROCEDURE test
(
    P_VERAN IN VARCHAR2, --PLANT_CODE
    P_ZDAY IN VARCHAR2,
    O_CURSOR OUT SYS_REFCURSOR
)
IS
BEGIN

    DELETE SHIFT_TEMP;
    COMMIT;
    
    DECLARE 
    DT VARCHAR2(8);
    LVL INT;

    CURSOR DT_CUR IS
        SELECT '' AS DT
             , '' LVL
          FROM DUAL;

    OPEN O_CURSOR FOR

    OPEN DT_CUR;
        LOOP
        FETCH DT_CUR INTO DT, LVL;
        EXIT WHEN DT_CUR %NOTFOUND;
        
        INSERT INTO aa
        SELECT aa
          FROM dual;
        
        END LOOP;
        
        CLOSE DT_CUR;
        END;
    /
    SET VERIFY ON
    SET SERVEROUTPUT OFF
    
    SELECT *
      FROM dual;        
END;

 

 

대충 위와같은 구조입니다.

내부 코드는 너무 길어 제거 했구요

프로시저에서 O_CURSOR로 조회한 내용을 출력해주는 구조입니다.

 

프로시저 만들기 전에 조회할때는 정상 동작하는데 프로시저에 집어넣으니 에러가 나네요...

PL/SQL을 잘 모르고 같이 일하는 분들중 오라클을 잘 아시는 분들이 없어 도움을 요청할곳이 없네요

 

도움을 간곡히 요청드립니다.

by 마농 [2022.02.23 15:59:09]

1. PL/SQL Block 의 구조에 어긋나네요.
DECLARE 를 사용했으면 BEGIN ~ END 가 세트로 따라 와야 합니다.
다음 2가지 방안을 선택할 수 있습니다.
방안1) DECLARE 다음 부분을 BEGIN ~ END 로 감싸기
방안2) DECLARE 를 빼고 변수 선언 부분을 BEGIN 앞으로 옮기기
- 프로시저에서는 IS 부분이 DECLARE 역할을 합니다.
http://gurubee.net/lecture/1342 -- PL/SQL Block 의 구조
http://gurubee.net/oracle/plsql -- Oracle PL/SQL 강좌

2. SQL*PLUS 명령어 제거
- SET 부분은 PL/SQL 이 아니라 SQL*PLUS 명령어입니다.

3. SELECT 절 사용
- SELECT * FROM dual; ?
- PL/SQL 에서는 SELECT 절 단독 사용 압됩니다.
- SELECT ~ INTO 를 사용하거나
- 커서 형태로 사용해야 합니다.


by 아야세 [2022.02.24 16:22:39]

BEGIN 이전에 커서를 실행하고 BEGIN 내에서는 조회는 하는 방법으로 해결했습니다.

감사합니다.


by 마농 [2022.02.24 16:35:57]

잘못된 표현 수정
- 커서를 실행하고 (X)
- 커서를 선언하고 (O)


by 아야세 [2022.02.24 16:38:56]

제가 질문에 올린 쿼리로 설명을 드리면, 9번행의 BEGIN 위에 11번행부터 37번행까지 올리니 남는건 조회하는것만 남더라구요 ㅎㅎ

 

/

    SET VERIFY ON

    SET SERVEROUTPUT OFF

은 불필요하니 삭제 했구요

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