[데이터베이스] 커서를 이용한 연습문제

    --커서를 이용한 문제. 
    /* 프로시저명을 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

     

    댓글