--커서를 이용한 문제.
/* 프로시저명을 EX_JOB_EMP로 하고, 실행 시 직급을 매개 변수 E_JOB으로 받아 처리함.
매개변수로 받은 직급에 해당하는 직원(EMP)을 모두 조회한 후,
커서를 이용하여 각 컬럼을 EMP_EMP 테이블에 INSERT 처리
출력은 "이름 님 부서코드는 10, 상사코드는 1001, 직급은 대리입니다." 형태로 모든 데이터 출력.
모든 처리가 끝나고 나서 결과 레코드 수 -> 10건 형태로 출력
커서가 열려 있을 경우만 커서 닫음 처리.
*/
CREATE TABLE EMP_TMP AS
SELECT * FROM EMP WHERE EMPNO <1;
SELECT * FROM EMP_TMP;
CREATE OR REPLACE PROCEDURE E_JOB_EMP
( E_JOB IN EMP.JOB%TYPE )
IS
DATA EMP_TMP%ROWTYPE;
CURSOR cjob IS SELECT * FROM EMP WHERE JOB LIKE '%'||E_JOB||'%'; --첫째줄
BEGIN
OPEN cjob;
LOOP
FETCH cjob INTO DATA;
INSERT INTO EMP_TMP VALUES DATA;
EXIT WHEN cjob%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(DATA.ENAME||'님의 부서코드는 '||DATA.DEPTNO||', 상사코드는 '||DATA.MGR||', 직급은 '||E_JOB||'입니다.');
END LOOP;
DBMS_OUTPUT.PUT_LINE('결과 레코드 수=>'||cjob%ROWCOUNT);
IF cjob%ISOPEN THEN
CLOSE cjob;
END IF;
END;
/
EXEC E_JOB_EMP('사원');
오류 1
커서로 담은 데이터를 담을 변수를 각각 정의함
-> %ROWTYPE 활용
오류 2
출력절에서 계속 오류남 (여기서 두가지 문제 1. 오탈자(구성요소가 정의되어야 합니다) 2 변수로 정의하지 않은 테이블 사용(~는 이 맥락에서 허용되지 않습니다) 여기선 당연히 DATA.ENAME ... 으로 사용해야 함)
오류 3
결과 레코드 수 출력을 LOOP 안에 위치
-> 마지막에 한 번 찍어주기 위해 밖에 위치
https://blog.naver.com/rjt2379/110013968566
SQL0100 - SQL0199
메세지 참조서 SQL0100 - SQL0199 SQL0100W FETCH, UPDATE 또는 DELETE...
blog.naver.com
https://www.ibm.com/docs/ko/db2woc?topic=plsql-using-rowtype-cursors
커서와 함께 %ROWTYPE 사용(PL/SQL)
%ROWTYPE 속성은 커서 또는 커서 변수에서 페치되는 모든 컬럼에 해당하는 필드가 포함된 레코드를 정의하는 데 사용됩니다. 각 필드는 그에 해당하는 컬럼의 데이터 유형을 가정합니다. %ROWTYPE 속
www.ibm.com
'Study > DataBase' 카테고리의 다른 글
[오라클] SQL DEVELOPER 경고 - 일부 모듈을 설치하지 못했습니다. (1) | 2024.01.11 |
---|---|
[데이터베이스] 오라클 JOB/ 페이징(ROWNUM) 연습문제 / SQL 튜닝(힌트) (1) | 2024.01.04 |
[데이터베이스] PL/SQL을 활용한 프로시저 (2) | 2024.01.03 |
[데이터베이스] 오라클 서브쿼리를 활용한 DDL / VIEW(뷰) 사용 예제/ INDEX(인덱스) 개념 (0) | 2024.01.02 |
[데이터베이스] 단일 서브쿼리 / 다중 서브쿼리의 사용 예 (0) | 2024.01.02 |
댓글