SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE PR_EMP_TEST9(P_DEPT_NO NUMBER)

    -- CURSOR 명 : EMP_CURSOR

    -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

IS

    CURSOR EMP_CURSOR IS

    SELECT EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = P_DEPT_NO;

    

BEGIN

    -- CURSOR OPEN 사용 X, FETCH 사용 X, EMP_RECORD 임의부여

    FOR EMP_RECORD IN EMP_CURSOR LOOP

       DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMP_NM || '님의 레코드는 다음과 같습니다. 

: ' || EMP_RECORD.EMP_NO || ' | ' || EMP_RECORD.EMP_ID || ' | ' || EMP_RECORD.DEPT_NO || ' | ' || EMP_RECORD.SAL );

      IF EMP_RECORD.SAL > 3000000 

      THEN INSERT INTO EMP745(EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL, INCOME_LVL) 

-- TABLE의 컬럼에 대해 반드시 명시해주자. 

          VALUES (EMP_RECORD.EMP_NO, EMP_RECORD.EMP_NM, EMP_RECORD.EMP_ID, 

EMP_RECORD.DEPT_NO, EMP_RECORD.SAL, '고소득');

      ELSE 

      INSERT INTO EMP745(EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL, INCOME_LVL)

-- TABLE의 컬럼에 대해 반드시 명시해주자. 

          VALUES (EMP_RECORD.EMP_NO, EMP_RECORD.EMP_NM, EMP_RECORD.EMP_ID,

EMP_RECORD.DEPT_NO, EMP_RECORD.SAL, '저소득');

      END IF;

    END LOOP;

END;

/


EXEC PR_EMP_TEST9(82);

SELECT * FROM EMP745;

DELETE FROM EMP745;

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE PR_EMP_TEST7(P_DEPT_NO NUMBER)

    -- CURSOR 명 : EMP_CURSOR

    -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

IS

    CURSOR EMP_CURSOR IS

    SELECT EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = &P_DEPT_NO;


    -- 변수를 선언한다.

    V_EMP_NO NUMBER(8) := 0;

    V_EMP_ID VARCHAR2(30);

    V_EMP_NM VARCHAR2(20);

    V_DEPT_NO NUMBER(4) := 0;

    V_SAL NUMBER(10) := 0;

    

BEGIN

  OPEN EMP_CURSOR;

    FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL;

    WHILE EMP_CURSOR%FOUND LOOP

      DBMS_OUTPUT.PUT_LINE(V_EMP_NM || '님의 레코드는 다음과 같습니다. : ' || V_DEPT_NO || ' | ' || V_EMP_NM || ' | ' 

|| V_EMP_ID || ' | ' || V_DEPT_NO || ' | ' || V_SAL );

      --다음 커서를 가져와야하므로 빼먹어서는 안된다. 만약 빼먹으면 무한루프에 빠지게된다.

        IF V_SAL > 3000000 

        THEN INSERT INTO EMP745(EMP_NO, EMP_NM, EMP_ID, DEPT_NO, SAL, INCOME_LVL)

            VALUES(V_EMP_NO, V_EMP_NM, V_EMP_NM, V_DEPT_NO, V_SAL, '고소득');

        ELSE 

        INSERT INTO EMP745(EMP_NO, EMP_NM, EMP_ID, DEPT_NO, SAL, INCOME_LVL)

            VALUES(V_EMP_NO, V_EMP_NM, V_EMP_NM, V_DEPT_NO, V_SAL, '저소득');

        END IF;

      FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL;

    END LOOP;

  CLOSE EMP_CURSOR;

END;

/


EXEC PR_EMP_TEST7(82);

SELECT * FROM EMP745;

DELETE FROM EMP745;

1. BASIC LOOP을 활용하여 EMP745 테이블의 레코드를 업데이트하여라.

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE PR_EMP_TEST5

  (P_DEPT_NO NUMBER)

IS

  -- CURSOR 명 : EMP_CURSOR

  -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

  CURSOR EMP_CURSOR IS

  SELECT EMP_NO, EMP_NM, EMP_ID, DEPT_NO, SAL

  FROM TB_LS_EMP867

  WHERE DEPT_NO = P_DEPT_NO;

  

  -- 변수를 선언한다.

    V_EMP_NO NUMBER(8) := 0;

    V_EMP_ID VARCHAR2(30);

    V_EMP_NM VARCHAR2(20);

    V_DEPT_NO NUMBER(4) := 0;

    V_SAL NUMBER(10) := 0;


BEGIN

  OPEN EMP_CURSOR;

    LOOP

      FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL;

      EXIT WHEN EMP_CURSOR%NOTFOUND;

        IF V_SAL > 3000000 THEN 

        -- TABLE의 컬럼에 대해 반드시 명시해주자. 

  INSERT INTO EMP745(EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL, INCOME_LVL) 

        VALUES (V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL, '고소득');

        

        ELSE INSERT INTO EMP745(EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL, INCOME_LVL)

        VALUES (V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL, '저소득');

        END IF;

     

    END LOOP;

  CLOSE EMP_CURSOR;  

END;

/


SELECT * FROM EMP745;

EXEC PR_EMP_TEST5(82);



-- 조합 데이터 타입의 2가지 종류

 -- 1. 레코드 (RECORD)

 -- 2. 컬렉션 (COLLECTION)


-- CURSOR

-- 수행하는 SQL문의 결과를 처리하기 위한 메모리영역

 -- 1. 암시적 커서: SQL%rowcount와 같은 커서를 말한다.

 -- 2. 명시적 커서: 메모리를 올려놓고 빈곳에다가 올리고 싶은 데이터를 올린다. 


-- 2. CURSOR를 사용하지 않고 FOR LOOP을 사용하여 TB_LS_EMP867 테이블에서 레코드를 뽑아봐라


SET SERVEROUTPUT ON;


CREATE OR REPLACE PROCEDURE PR_EMP_TEST2

(P_DEPT_NO NUMBER)


IS

    -- CURSOR 명 : EMP_CURSOR

    -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다. 

    CURSOR EMP_CURSOR IS

    SELECT EMP_NO, EMP_NM, EMP_ID, DEPT_NO, SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = P_DEPT_NO;

  

BEGIN

      -- CURSOR를 특별하게 사용하지 않고 FOR ..  LOOP을 돌려보자.

      FOR EMP_RECORD IN EMP_CURSOR LOOP

        DBMS_OUTPUT.PUT_LINE('================');

        DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMP_NM);

        DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMP_NO);

        DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMP_ID);

        DBMS_OUTPUT.PUT_LINE(EMP_RECORD.DEPT_NO);

        DBMS_OUTPUT.PUT_LINE(EMP_RECORD.SAL);

        DBMS_OUTPUT.PUT_LINE('================');

      END LOOP;

END;

/


EXEC PR_EMP_TEST2(82);



---- 조합 데이터 타입의 2가지 종류

 -- 1. 레코드 (RECORD)

 -- 2. 컬렉션 (COLLECTION)


-- CURSOR

-- 수행하는 SQL문의 결과를 처리하기 위한 메모리영역

 -- 1. 암시적 커서: SQL%rowcount와 같은 커서를 말한다.

 -- 2. 명시적 커서: 메모리를 올려놓고 빈곳에다가 올리고 싶은 데이터를 올린다. 


1. CURSOR를 사용하지 않고 FOR LOOP을 사용하여 TB_LS_EMP867 테이블에서 레코드를 뽑아봐라


SET SERVEROUTPUT ON;

ACCEPT P_DEPT_NO PROMPT '원하는 부서를 입력하고 FOR..LOOP과 CURSOR를 이용하여 데이터를 추출해보아라.';


DECLARE 


    -- CURSOR 명 : EMP_CURSOR

    -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

    CURSOR EMP_CURSOR IS 

    SELECT EMP_NO, EMP_NM, EMP_ID, DEPT_NO, SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = &P_DEPT_NO;


BEGIN

      -- CURSOR를 특별하게 사용하지 않고 FOR ..  LOOP을 돌려보자.

-- FOR 와 IN 사이EMP_RECORD 의경우 임의로 작명해도된다. : EMP_CURSOR 의 값들을 담아놓은 객체라보면된다.

      FOR EMP_RECORD IN EMP_CURSOR LOOP

        DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMP_NM || '님의 레코드는 다음과 같습니다. 

        : ' || EMP_RECORD.EMP_NO || ' | ' || EMP_RECORD.EMP_ID || ' | ' || EMP_RECORD.DEPT_NO || ' | ' || EMP_RECORD.SAL );

      END LOOP;

END;

/

-- EMP_CURSOR%FOUND : 커서에서 데이터가 발견되면 TRUE

-- EMP_CURSOR%NOTFOUND : 커서에서 데이터가 발견되지 않으면 TRUE  


SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE PR_EMP_TEST2

(P_DEPT_NO NUMBER)

IS 

  -- CURSOR 명 : EMP_CURSOR

  -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

  CURSOR EMP_CURSOR IS

  SELECT EMP_NO, EMP_NM, EMP_ID, DEPT_NO, SAL

  FROM TB_LS_EMP867

  WHERE DEPT_NO = P_DEPT_NO;

  

  -- 변수를 선언한다.

  V_EMP_NO NUMBER(8) := 0;

  V_EMP_ID VARCHAR2(30);

  V_EMP_NM VARCHAR2(20);

  V_DEPT_NO NUMBER(4) := 0;

  V_SAL NUMBER(10) := 0;


BEGIN

  OPEN EMP_CURSOR;

    FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_NM, V_EMP_ID, V_DEPT_NO, V_SAL;

    WHILE EMP_CURSOR%FOUND LOOP

      DBMS_OUTPUT.PUT_LINE(V_EMP_NM || '님의 레코드는 다음과 같습니다.

 : ' || V_DEPT_NO || ' | ' || V_EMP_NM || ' | ' || V_EMP_ID || ' | ' || V_DEPT_NO || ' | ' || V_SAL );

      FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_NM, V_EMP_ID, V_DEPT_NO, V_SAL;

    END LOOP;

  CLOSE EMP_CURSOR;

END;

/


EXEC PR_EMP_TEST2(82);


-- EMP_CURSOR%FOUND : 커서에서 데이터가 발견되면 TRUE

-- EMP_CURSOR%NOTFOUND : 커서에서 데이터가 발견되지 않으면 TRUE  


SET SERVEROUTPUT ON;

ACCEPT P_DEPT_NO PROMPT '데이터가 필요한 부서를 입력하시오';


DECLARE 

    -- CURSOR 명 : EMP_CURSOR

    -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

    CURSOR EMP_CURSOR IS

    SELECT EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = &P_DEPT_NO;


    -- 변수를 선언한다.

    V_EMP_NO NUMBER(8) := 0;

    V_EMP_ID VARCHAR2(30);

    V_EMP_NM VARCHAR2(20);

    V_DEPT_NO NUMBER(4) := 0;

    V_SAL NUMBER(10) := 0;

    

BEGIN

  OPEN EMP_CURSOR;

    FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL;

    WHILE EMP_CURSOR%FOUND LOOP

      DBMS_OUTPUT.PUT_LINE(V_EMP_NM || '님의 레코드는 다음과 같습니다. : ' || V_DEPT_NO || ' | ' 

|| V_EMP_NM || ' | ' || V_EMP_ID || ' | ' || V_DEPT_NO || ' | ' || V_SAL );

      FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL; 

-- next()와 비슷하게 생각해라.

    END LOOP;

  CLOSE EMP_CURSOR;

END;

/

-- 조합 데이터 타입의 2가지 종류

 -- 1. 레코드 (RECORD)

 -- 2. 컬렉션 (COLLECTION)


-- CURSOR

-- 수행하는 SQL문의 결과를 처리하기 위한 메모리영역

 -- 1. 암시적 커서: SQL%rowcount와 같은 커서를 말한다.

 -- 2. 명시적 커서: 메모리를 올려놓고 빈곳에다가 올리고 싶은 데이터를 올린다. 


-- EMP_CURSOR%FOUND : 커서에서 데이터가 발견되면 TRUE

-- EMP_CURSOR%NOTFOUND : 커서에서 데이터가 발견되지 않으면 TRUE 


1-2 부서번호를 입력하면 해당 부서번호에 속한 사원들의 사원번호, 이름, 월급을 출력하는 프로시저를 작성하라.


SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE PR_TAB_EMP867_ALL_DATA

(P_DEPT_NO NUMBER)

IS

-- CURSOR 명 : EMP_CURSOR

-- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

    CURSOR EMP_CURSOR IS

    SELECT EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = P_DEPT_NO;

  

-- 변수를 선언한다.

    V_EMP_NO NUMBER(8) := 0;

    V_EMP_ID VARCHAR2(30);

    V_EMP_NM VARCHAR2(20);

    V_DEPT_NO NUMBER(4) := 0;

    V_SAL NUMBER(10) := 0;

    

BEGIN


-- CURSOR를 연다.

    OPEN EMP_CURSOR;

-- LOOP 을 돌리면서 EMP_CURSOR 안에 담긴 데이터들을 변수에 삽입한다.

    LOOP

-- FETCH: (어디를가서)가져오다.

      FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL;

      EXIT WHEN EMP_CURSOR%NOTFOUND;

      DBMS_OUTPUT.PUT_LINE(V_EMP_NM || '님의 레코드는 다음과 같습니다. : ' || V_DEPT_NO || ' | ' || V_EMP_NM || ' | ' || V_EMP_ID || ' | '  

|| V_DEPT_NO || ' | ' || V_SAL );

    END LOOP;

-- CURSOR를 닫는다.

    CLOSE EMP_CURSOR;

    

END;

/


EXEC PR_TAB_EMP867_ALL_DATA(82);



-- 조합 데이터 타입의 2가지 종류

 -- 1. 레코드 (RECORD)

 -- 2. 컬렉션 (COLLECTION)


-- CURSOR

-- 수행하는 SQL문의 결과를 처리하기 위한 메모리영역

 -- 1. 암시적 커서: SQL%rowcount와 같은 커서를 말한다.

 -- 2. 명시적 커서: 메모리를 올려놓고 빈곳에다가 올리고 싶은 데이터를 올린다. 


-- EMP_CURSOR%FOUND : 커서에서 데이터가 발견되면 TRUE

-- EMP_CURSOR%NOTFOUND : 커서에서 데이터가 발견되지 않으면 TRUE 


###########################################################################################


1-1. 부서번호를 물어보게 하고 부서번호를 입력하면 해당 부서번호에 속한 사원들의 사원번호, 이름, 월급을 출력하시오.


SET SERVEROUTPUT ON;

ACCEPT P_DEPT_NO PROMPT '정보를 원하는 부서번호를 입력하세요.';

DECLARE 

    -- CURSOR 명 : EMP_CURSOR

    -- EMP_CURSOR 에 조건에 맞는 TB_LS_EMP867 테이블에서 가져온 데이터들을 담아준다.

    CURSOR EMP_CURSOR IS

    SELECT EMP_NO, EMP_NM, EMP_ID, DEPT_NO, SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = &P_DEPT_NO;

  

    -- 변수를 선언한다.

    V_EMP_NO NUMBER(8) := 0;

    V_EMP_ID VARCHAR2(30);

    V_EMP_NM VARCHAR2(20);

    V_DEPT_NO NUMBER(4) := 0;

    V_SAL NUMBER(10) := 0;

  

BEGIN

    -- CURSOR를 연다.

    OPEN EMP_CURSOR; 

    -- LOOP 을 돌리면서 EMP_CURSOR 안에 담긴 데이터들을 변수에 삽입한다.

    LOOP 

      -- FETCH: (어디를가서)가져오다.

      FETCH EMP_CURSOR INTO V_EMP_NO, V_EMP_NM, V_EMP_ID, V_DEPT_NO, V_SAL;

      EXIT WHEN EMP_CURSOR%NOTFOUND;

      DBMS_OUTPUT.PUT_LINE(V_EMP_NM || '님의 레코드는 다음과 같습니다. : ' || V_DEPT_NO || ' | ' || V_EMP_NM || ' | ' || V_EMP_ID || ' | ' ||

      V_DEPT_NO || ' | ' || V_SAL );

    END LOOP;

    -- CURSOR를 닫는다.

    CLOSE EMP_CURSOR;

END;

/


SET SERVEROUTPUT ON;

ACCEPT P_DEPT_NO PROMPT '정보를 원하는 부서번호를 입력하세요.';

DECLARE 


    V_EMP_NO NUMBER(8) := 0;

    V_EMP_ID VARCHAR2(30);

    V_EMP_NM VARCHAR2(20);

    V_DEPT_NO NUMBER(4) := &P_DEPT_NO;

    V_SAL NUMBER(10) := 0;

  

BEGIN

    SELECT EMP_NO, EMP_ID, EMP_NM, DEPT_NO, SAL 

    INTO V_EMP_NO, V_EMP_ID, V_EMP_NM, V_DEPT_NO, V_SAL

    FROM TB_LS_EMP867

    WHERE DEPT_NO = V_DEPT_NO;

    

    DBMS_OUTPUT.PUT_LINE(V_EMP_NO);

    DBMS_OUTPUT.PUT_LINE(V_EMP_ID);

    DBMS_OUTPUT.PUT_LINE(V_EMP_NM);

    DBMS_OUTPUT.PUT_LINE(V_DEPT_NO);

    DBMS_OUTPUT.PUT_LINE(V_SAL);



--ORA-01403: no data found 대처 SQL문  

-- 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다.

    EXCEPTION

    WHEN NO_DATA_FOUND THEN NULL;

    WHEN OTHERS THEN

    NULL;

    

END;

/


-- EXCEPTION 처리를 해줘야한다. (루프를 안돌렸으므로) 그렇지않으면 에러 발생 exact fetch returns more than requested number of rows

+ Recent posts