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을 잘 모르고 같이 일하는 분들중 오라클을 잘 아시는 분들이 없어 도움을 요청할곳이 없네요
도움을 간곡히 요청드립니다.
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 를 사용하거나
- 커서 형태로 사용해야 합니다.