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 를 사용하거나
- 커서 형태로 사용해야 합니다.
BEGIN 이전에 커서를 실행하고 BEGIN 내에서는 조회는 하는 방법으로 해결했습니다.
감사합니다.
잘못된 표현 수정
- 커서를 실행하고 (X)
- 커서를 선언하고 (O)
제가 질문에 올린 쿼리로 설명을 드리면, 9번행의 BEGIN 위에 11번행부터 37번행까지 올리니 남는건 조회하는것만 남더라구요 ㅎㅎ
/
SET VERIFY ON
SET SERVEROUTPUT OFF
은 불필요하니 삭제 했구요