본문 바로가기

IT/오라클

20장+PLSQL+기초 2

-- statements : 작업명령어

/*

SET SERVEROUTPUT ON

DECLARE

    VEMPNO NUMBER(4);

    VENAME VARCHAR2(20);

    VDEPTNO       EMP.DEPTNO%TYPE; -- %TYPE; : emp.deptno를 참조

    VDNAME VARCHAR2(20) := NULL;

BEGIN

    SELECT EMPNO, ENAME, DEPTNO INTO VEMPNO, --empno, ename, deptno를 저장할수 있는 

    VENAME, VDEPTNO 

 FROM  EMP

 WHERE EMPNO=7788;

*/


/*

 IF (VDEPTNO = 10)  THEN

      VDNAME := 'ACCOUNTING';

 END IF;

 IF (VDEPTNO = 20)  THEN

     VDNAME := 'RESEARCH';

 END IF;

 IF (VDEPTNO = 30)  THEN

      VDNAME := 'SALES';

 END IF;

 IF (VDEPTNO = 40) THEN  

      VDNAME := 'OPERATIONS';

 END IF;

 DBMS_OUTPUT.PUT_LINE('사번    이름    부서명');

 DBMS_OUTPUT.PUT_LINE(VEMPNO||'    '||VENAME ||'    '||VDNAME);

END;

*/

-- 절차 ( 흐름 제어 )

/*

VDNAME := 'ACCOUNTING'; -- 무조건 실행

IF (조건식)  THEN -- 조건 실행

    VDNAME := 'ACCOUNTING';

END IF;

*/


SET SERVEROUTPUT ON

------------------------------------------------------------------------------------

-- 컬럼입력변수, 출력결과변수 (초기값) 선언

-- 변수=메모리(보관함, 상자라고 생각하면 됨, 변수명=메모리주소번지

DECLARE -- DECLARE : 선언영역

    VEMPNO  NUMBER(4); -- 오라클입장(자료형이 메모리로 인지), 숫자를 4개를 저장할 수 있는 메모리

    VENAME   VARCHAR2(20); -- 문자 20개를 저장할 수 있는 메모리

    VDEPTNO EMP.DEPTNO%TYPE;

    VDNAME  VARCHAR2(20) := NULL; -- NULL : 깨끗하게 비어있다. 

------------------------------------------------------------------------------------

BEGIN -- 실행영역 시작

/*

    ★★★★

    SELECT EMPNO, ENAME, DEPTNO INTO VEMPNO, VENAME, VDEPTNO 에서

    앞에 있는 EMPNO, ENAME, DEPTNO 추출해서 

    뒤에 있는 VEMPNO, VENAME, VDEPTNO에 넣어줌

*/

    SELECT EMPNO, ENAME, DEPTNO INTO VEMPNO, VENAME, VDEPTNO 

    FROM  EMP

    WHERE EMPNO=7788;

    IF (VDEPTNO = 10)  THEN

        VDNAME := 'ACCOUNTING';

    END IF;

    IF (VDEPTNO = 20)  THEN

        VDNAME := 'RESEARCH';

    END IF;

    IF (VDEPTNO = 30)  THEN

        VDNAME := 'SALES';

    END IF;

    IF (VDEPTNO = 40) THEN  

        VDNAME := 'OPERATIONS';

    END IF;

    DBMS_OUTPUT.PUT_LINE('사번    이름    부서명');

    DBMS_OUTPUT.PUT_LINE(VEMPNO||'    '||VENAME ||'    '||VDNAME);

END; -- 실행영역 종료






SET SERVEROUTPUT ON

DECLARE

    -- %ROWTYPE 속성으로 로우 전체를 저장할 수 있는 레퍼런스 변수 선언 

    VEMP EMP%ROWTYPE; -- 모든 컬럼이 가지고 있는값을 VEMP에 저장

    ANNSAL NUMBER(7,2); -- 스칼라로 직접 명시

BEGIN

    DBMS_OUTPUT.PUT_LINE('사번 / 이름 / 연봉'); 

    DBMS_OUTPUT.PUT_LINE('---------------------');

    -- SCOTT 사원의 전체 정보를 로우 단위로 얻어와 VEMP에 저장한다. 

    SELECT * INTO VEMP -- *을 가져와서 VEMP에 저장

    FROM EMP

    WHERE ENAME='SCOTT';


    -- 커미션이 NULL일 경우 0으로 변경해야 올바른 연봉 계산

--    VEMP.COMM := NVL(VEMP.COMM, 0); -- 하나의 문장으로 작성

--    IF VEMP.COMM IS NULL THEN

--    VEMP.COMM := 0;

--    END IF;


    IF (VEMP.COMM IS NULL)THEN      -- 커미션이 NULL 이면 

        ANNSAL:=VEMP.SAL*12;          -- 급여에 12를 곱한다.

      ELSE                            -- 커미션이 NULL이 아니면 

        ANNSAL:=VEMP.SAL*12+VEMP.COMM;

        -- 급여에 12를 곱한 후 커미션과 합산

      END IF;

    -- 스칼라 변수에 연봉을 계산할 결과를 저장한다.

    -- ANNSAL := VEMP.SAL*12+VEMP.COMM;

    -- 결과 출력 

    DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO || ' / ' || VEMP.ENAME || ' / ' || ANNSAL );

END;

--------------------------

/*

    1. 함수를 로드, 포함, 가져오기

    2. 함수 호출(함수명())

    

    오라클 소스코드를 시스템코드로 번역(컴파일) 후 실행

    -번역되 있기 때문에 번역이 따로 필요하지 않음

    VEMP.COMM := NVL(VEMP.COMM, 0); 

 

    오라클은 아래 코드를 번역해야 함.

--    IF VEMP.COMM IS NULL THEN

--    VEMP.COMM := 0;

--    END IF;

*/




SET SERVEROUTPUT ON

-- 중첩if (다중조건 선택)

DECLARE

  VEMP EMP%ROWTYPE;

  VDNAME VARCHAR2(14);

BEGIN

  DBMS_OUTPUT.PUT_LINE('사번     /     이름     /     부서명'); 

  DBMS_OUTPUT.PUT_LINE('--------------------');


  SELECT * INTO VEMP

  FROM EMP

  WHERE ENAME='SCOTT';

    IF (VEMP.DEPTNO = 10)  THEN 

        VDNAME := 'ACCOUNTING';

    ELSIF (VEMP.DEPTNO = 20)  THEN

        VDNAME := 'RESEARCH';

    ELSIF (VEMP.DEPTNO = 30)  THEN

        VDNAME := 'SALES';

    ELSIF (VEMP.DEPTNO = 40) THEN  

        VDNAME := 'OPERATIONS';

    -- 선택가능성 낮은 조건을 아래쪽에 배치

    ELSIF(VEMP.DEPTNO = 50 ) THEN

        VDNAME := '개발부';

    END IF;

    DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO||'  /  '|| VEMP.ENAME||'  /  '||VDNAME); 

END;








-- 반복문(영어로 루푸(돈다))

/*

    [ 문법 ]

    LOOP

    statement1;

    statement2;

    . . . . . .

    EXIT [WHEN condition];

    END LOOP

*/

/*

    오라클은 소스코드를 시스템코드로 번역(컴파일)후 실행

    문장 반복성 분석

    데이터 변경 (반복규칙) : 1, 2, 3 

    실행문장 변경 (반복규칙) : DBMS_OUTPUT.PUT_LINE 비변경 반복

    

    DBMS_OUTPUT.PUT_LINE( 1 );

    DBMS_OUTPUT.PUT_LINE( 2 );

    DBMS_OUTPUT.PUT_LINE( 3 );

    

*/

SET SERVEROUTPUT ON

-- 기본루프 : 반복 실행회수 모를 때

-- 루프를 적어도 한 번은 실행 할 때

DECLARE

    N NUMBER := 1;

BEGIN

    LOOP

        DBMS_OUTPUT.PUT_LINE( N );

        N := N + 1;

        IF N > 5 THEN

            EXIT;

        END IF;

    END LOOP;

END;



SET SERVEROUTPUT ON

-- 기본루프 : 반복 실행회수 모를 때

-- 루프를 적어도 한 번은 실행 할 때

DECLARE

    N NUMBER := 1;

BEGIN

    LOOP

        DBMS_OUTPUT.PUT_LINE( N );

            N := N + 1;

        -- IF N > 5 THEN

            EXIT WHEN N > 5;

        -- END IF;

    END LOOP;

END;



-- WHILE : ~ 하는 동안 

SET SERVEROUTPUT ON

DECLARE

    N NUMBER := 1;

BEGIN

    WHILE N <= 5 LOOP --N이 5 이하인 동안

        DBMS_OUTPUT.PUT_LINE( N );

        N := N + 1;

    END LOOP;

END;


-- FOR

-- 반복 실행 횟수를 알 떄(시작값, 마지막 값)

-- FOR N (인덱스: 순번)

/*

FOR LOOP 문에서 사용되는 인덱스는 정수로 

자동 선언되므로 따로 선언할 필요가 없다.


FOR LOOP 문은 LOOP을 반복할 때마다 

자동적으로 1씩 증가 또는 감소합니다. 

REVERSE는 1씩 감소함을 의미합니다.

 */

SET SERVEROUTPUT ON

DECLARE

BEGIN

    FOR N IN 1..10 LOOP

        DBMS_OUTPUT.PUT_LINE( N );

    END LOOP;

END;



SET SERVEROUTPUT ON

DECLARE

BEGIN

    FOR N IN 1..10 LOOP -- 오름차순으로 출력

        DBMS_OUTPUT.PUT_LINE( N );

        EXIT WHEN N=4; --조건 4까지만 출력

    END LOOP;

END;


SET SERVEROUTPUT ON

DECLARE

BEGIN

    FOR N IN reverse 1..10 LOOP --reverse : 내림차순으로 출력

        DBMS_OUTPUT.PUT_LINE( N );

        EXIT WHEN N=4; --조건 4까지만 출력

    END LOOP;

END;


SET SERVEROUTPUT ON


SET SERVEROUTPUT ON

DECLARE

BEGIN

    FOR N IN 1..5 LOOP

        DBMS_OUTPUT.PUT_LINE( N*2 );

    END LOOP;

END;


-- 석래 아저씨가 한거

DECLARE

   V_CNT NUMBER := length('abc');

   V_STR VARCHAR2(10) := NULL;

BEGIN

   FOR N IN 1..V_CNT LOOP

      V_STR := V_STR || '*';-- *, **, *** : SUM = SUM + 1

      DBMS_OUTPUT.PUT_LINE(V_STR);-- *, **, ***

   END LOOP;

END;


-- 샘이 한거

DECLARE

    START_CNT VARCHAR2(20);

BEGIN

    FOR J IN 1..LENGTH('ABC') LOOP

    START_CNT := START_CNT || '*';

    END LOOP;

    DBMS_OUTPUT.PUT_LINE(START_CNT);

END;


DECLARE

BEGIN

    FOR N IN 1..5 LOOP

        DBMS_OUTPUT.PUT_LINE( N*2 );

    END LOOP;

END;



SET SERVEROUTPUT ON

DECLARE

BEGIN

    FOR N IN 1..5 LOOP

        DBMS_OUTPUT.PUT_LINE( N*2 );

    END LOOP;

END;


-- 석래 아저씨가 한거

DECLARE

   V_CNT NUMBER := length('abc');

   V_STR VARCHAR2(10) := NULL;

BEGIN

   FOR N IN 1..V_CNT LOOP

      V_STR := V_STR || '*';-- *, **, *** : SUM = SUM + 1

      DBMS_OUTPUT.PUT_LINE(V_STR);-- *, **, ***

   END LOOP;

END;


-- 샘이 한거

DECLARE

    START_CNT VARCHAR2(20);

BEGIN

    FOR J IN 1..LENGTH('ABC') LOOP

    START_CNT := START_CNT || '*';

    END LOOP;

    DBMS_OUTPUT.PUT_LINE(START_CNT);

END;





CREATE OR REPLACE PROCEDURE CURSOR_SAMPLE02

IS

VDEPT DEPT%ROWTYPE;

CURSOR C1 

IS

SELECT * FROM DEPT;

BEGIN

    DBMS_OUTPUT.PUT_LINE('부서번호 / 부서명 / 지역명'); 

    DBMS_OUTPUT.PUT_LINE('----------------------------');


    FOR VDEPT IN C1 LOOP

        EXIT WHEN C1%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE(VDEPT.DEPTNO||' '||VDEPT.DNAME||' '||VDEPT.LOC); 

    END LOOP;

END;


--SELECT ENAME FROM EMP;

--실행시 여러개의 행으로 구성되 있을경우 

--SELECT ENAME INTO ENAME FROM EMP;

--위처럼 할수 없음

-- FOR IN SELECT

SET SERVEROUTPUT ON

DECLARE

    I NUMBER := 0;

BEGIN

    -- EMP 테이블에서 사원이름과 직급을 얻어옴

    -- 사원이름과 직급을 K 레코드 반복변수에 저장

    FOR K IN (SELECT ENAME, JOB FROM EMP) LOOP

        I := I + 1; -- 인덱스 증가

        DBMS_OUTPUT.PUT_LINE(K.ENAME || ' / ' || K.JOB);

    END LOOP;

END;


/*

-- 커서

DECLARE

-- 커서 선언

CURSOR cursor_name  IS statement;

BEGIN

-- 커서 열기

OPEN cursor_name;

--커서로부터 데이터를 읽어와 변수에 저장

FECTCH cur_name INTO variable_name;

--커서 닫기

CLOSE cursor_name;

END;

*/


DECLARE

    VDEPT DEPT%ROWTYPE;

CURSOR C1 

IS

SELECT * FROM DEPT;

BEGIN

    DBMS_OUTPUT.PUT_LINE('부서번호 / 부서명 / 지역명'); 

    DBMS_OUTPUT.PUT_LINE('----------------------------');

    FOR VDEPT IN C1 LOOP

        EXIT WHEN C1%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE(VDEPT.DEPTNO||' '||VDEPT.DNAME||' '||VDEPT.LOC); 

    END LOOP;

END;




-- 모든 사원명과 사원명의 문자수 만큼 * 출력

SET SERVEROUTPUT ON

DECLARE

    I NUMBER := 0;

BEGIN

    -- EMP 테이블에서 사원이름과 직급을 얻어옴

    -- 사원이름과 직급을 K 레코드 반복변수에 저장

    FOR K IN (SELECT ENAME, JOB FROM EMP) LOOP

        I := I + 1; -- 인덱스 증가

        DBMS_OUTPUT.PUT_LINE(K.ENAME || ' / ' || K.JOB);

    END LOOP;

END;

SELECT * FROM EMP;

DECLARE

    START_CNT VARCHAR2(20);

    I NUMBER := 0;

BEGIN

    FOR K IN (SELECT ENAME, JOB FROM EMP) LOOP

        --I := I + 1; -- 인덱스 증가

        START_CNT := START_CNT || '*';

    END LOOP;

        --DBMS_OUTPUT.PUT_LINE(K.ENAME || ' / ' || START_CNT);

        DBMS_OUTPUT.PUT_LINE(START_CNT);

END;


-- 모든 사원명과 사원명의 문자수 만큼 * 출력

SET SERVEROUTPUT ON

DECLARE

  STAR_CNT VARCHAR2(20) ;

BEGIN  

  -- EMP 테이블에서 사원이름과 직급 행을 얻어옴

  -- 사원이름과 직급행을 K 레코드 번복변수에 저장

    FOR K IN (SELECT ENAME, JOB FROM EMP) LOOP

        FOR J IN 1..LENGTH(K.ENAME) LOOP

            STAR_CNT := STAR_CNT || '*';  --*누적합변수  

        END LOOP;       

        DBMS_OUTPUT.PUT_LINE( K.ENAME || ' / ' || STAR_CNT); 

        STAR_CNT:='';  -- 재초기화

        --STAR_CNT:=NULL;  -- 재초기화

    END LOOP;

END;











---------- PLSQL -----------

set serveroutput on;

begin

dbms_output.put_line('hello world!');

end;


set serveroutput on

declare

    vempno number(4);

    vname varchar2(10);

begin

    vempno := 7788;

    vname := 'SCOTT';

    dbms_output.put_line('사번 / 이름');

    dbms_output.put_line('---------');

    dbms_output.put_line(vempno||vname);

end;


/*

    스칼라 선언법

    

    number : 숫자

    varchar2 : 문자


    vempno number(4);

    vename varchar(10);

    

    레퍼런스

    %type ( 컬럼 단위로 참조 ) : 데이터베이스 컬럼에 맞추어 변수 선언

    즉, 그 변수나 컬럼과 같은 타입의 형을 쓴다는 말

    

    vempno emp.empno%type;

    vename emp.ename%type;


    %rowtype ( 로우 : 행 단위로 참조 )

*/


set serveroutput on

declare

    vempno emp.empno%type;

    vename emp.ename%type;

begin

    dbms_output.put_line('사번        /       이름');

    dbms_output.put_line('-----------------');

    

    select empno, ename into vempno, vename

    from emp

    where ename='SCOTT';

    

    dbms_output.put_line(vempno || '    /    ' || vename);

end;



-- for문

BEGIN  

  -- EMP 테이블에서 사원이름과 직급을 얻어옴

  FOR  K IN (SELECT ENAME, JOB FROM EMP) LOOP

    I := I + 1;                                --인덱스 증가

    ENAME_TABLE(I) := K.ENAME;   --사원이름과 

    JOB_TABLE(I) := K.JOB;          --직급을 저장. 

  END LOOP;


  --테이블에 저장된 내용을 출력

  FOR J IN 1..I LOOP          

    DBMS_OUTPUT.PUT_LINE(RPAD(ENAME_TABLE(J),12) 

       || ' / ' ||  RPAD(JOB_TABLE(J),9));

  END LOOP;

END;




-- 문법

BEGIN

    -- SCOTT 사원의 정보를 레코드 변수에 저장

    SELECT empno, ename, job, deptno

    INTO emp_record

    FROM emp

    WHERE ename = UPPER('SCOTT');


  -- 레코드 변수에 저장된 사원 정보를 출력

  DBMS_OUTPUT.PUT_LINE('사원번호 : ' || TO_CHAR(emp_record.v_empno));

  DBMS_OUTPUT.PUT_LINE('이     름: ' || emp_record.v_ename);

  DBMS_OUTPUT.PUT_LINE('담당업무 : ' || emp_record.v_job);

  DBMS_OUTPUT.PUT_LINE('부서번호 : ' || TO_CHAR(emp_record.v_deptno));

END;


-- IF-THEN-END IF

SET SERVEROUTPUT ON

DECLARE

   VEMPNO NUMBER(4);

   VENAME VARCHAR2(20);

   VDEPTNO       EMP.DEPTNO%TYPE;

   VDNAME VARCHAR2(20) := NULL;

BEGIN

 SELECT EMPNO, ENAME, DEPTNO INTO VEMPNO,

               VENAME, VDEPTNO 

 FROM  EMP

 WHERE EMPNO=7788;

  IF (VDEPTNO = 10)  THEN

      VDNAME := 'ACCOUNTING';

 END IF;

 IF (VDEPTNO = 20)  THEN

     VDNAME := 'RESEARCH';

 END IF;

 IF (VDEPTNO = 30)  THEN

      VDNAME := 'SALES';

 END IF;

 IF (VDEPTNO = 40) THEN  

      VDNAME := 'OPERATIONS';

 END IF;


 DBMS_OUTPUT.PUT_LINE('사번    이름    부서명');

 DBMS_OUTPUT.PUT_LINE(VEMPNO||'    '||VENAME

  ||'    '||VDNAME);

END;


 

-- 부서번호로 부서명 알아내기

SET SERVEROUTPUT ON

DECLARE

  VEMP EMP%ROWTYPE;

  VDNAME VARCHAR2(14);

BEGIN

  DBMS_OUTPUT.PUT_LINE('사번 / 이름 / 부서명'); 

  DBMS_OUTPUT.PUT_LINE('--------------------');


  SELECT * INTO VEMP

  FROM EMP

  WHERE ENAME='SCOTT';


    IF (VEMP.DEPTNO = 10)  THEN

        VDNAME := 'ACCOUNTING';

    ELSIF (VEMP.DEPTNO = 20)  THEN

        VDNAME := 'RESEARCH';

    ELSIF (VEMP.DEPTNO = 30)  THEN

        VDNAME := 'SALES';

    ELSIF (VEMP.DEPTNO = 40) THEN  

        VDNAME := 'OPERATIONS';

    END IF;

    

    DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO||'/'||

    VEMP.ENAME||'/'||VDNAME); 

END;


/*

    저장 프로시저

    

    우리가 만든 PL/SQL을 저장해 놓고 

    필요한 경우 호출하여 사용할 수 있으면 할 때가 있습니다. 

    

    오라클은 사용자가 만든 PL/SQL 문을 데이터베이스에 저장 할 수 있도록 

    저장프로시저라는 것을 제공합니다. 


    저장 프로시저를 생성하려면 CREATE PROCEDURE 다음에 

    새롭게 생성하고자 하는 프로시저 이름을 기술합니다


    프로시저는 여러 번 반복해서 호출해서 사용할 수 있다는 장점이 있습니다.

    

    저장 프로시저를 제거하기 위해서는 DROP PROCEDURE 다음에 

    제거하고자 하는 프로시저 이름을 기술합니다.


    [MODE] 는 IN과 OUT, INOUT 세 가지를 기술할 수 있는데 

    IN 데이터를 전달 받을 때 쓰고 OUT은 수행된 결과를 받아갈 때 사용합니다. 

    INOUT은 두 가지 목적에 모두 사용됩니다. 

*/


-- 저장 프로시저 생성하기

-- replace : 대신하다.

-- procedure : 절차

-- from : (출발지) …에서(부터)

create or replace procedure del_all

is

begin

delete from emp01;

end;


-- 생성된 저장 프로시저는 EXECUTE 명령어로 실행

-- execute : 1. 처형하다   2. 실행하다   3. (어떤 기술적인 동작을) 해내다

execute del_all;


/*

    저장 프로시저 조회하기


    USER_SOURCE의 내용을 조회하면 

    어떤 저장 프로시저가 생성되어 있는지와 

    해당 프로시저의 내용이 무엇인지 확인할 수 있습니다

*/

desc user_source;


-- 매개변수가 있는 저장프로시저는 다음과 같이 정의

CREATE OR REPLACE PROCEDURE 

DEL_ENAME(VENAME EMP01.ENAME%TYPE)

IS

BEGIN

DELETE FROM EMP01 WHERE ENAME=VENAME;

END;


/*

    저장 프로시저 이름인 DEL_ENAME 다음에 ( )를 추가하여 

    그 안에 선언한 변수가 매개 변수입니다.

    이 매개변수에 값은 프로시저를 호출할 때 전달해 줍니다. 

*/

EXECUTE DEL_ENAME('SMITH');



-- 커서

/*

    DECLARE


    -- 커서 선언

    CURSOR cursor_name  IS statement;

    BEGIN


    -- 커서 열기 : 첫 번째 행을 가리킴

    OPEN cursor_name;


    --커서로부터 데이터를 읽어와 변수에 저장 

    -- fectch : 가지고오다

    -- INTO : 안으로, (...방향)으로

    FECTCH cur_name INTO variable_name;


    --커서 닫기

    CLOSE cursor_name;

    END;

*/

/*

    커서를 사용하여 부서 테이블의 모든 내용을 출력합시다. 

    1. ED 다음에 파일이름을 입력하여 

    새로 생긴 SQL 파일에 다음과 같이 입력하시오.

    (파일이름:PROC05.SQL)

*/


CREATE OR REPLACE PROCEDURE CURSOR_SAMPLE01

IS

   VDEPT DEPT%ROWTYPE;

   CURSOR C1 

   IS

   SELECT  *  FROM  DEPT; 

BEGIN

   DBMS_OUTPUT.PUT_LINE('부서번호 / 부서명 / 지역명'); 

   DBMS_OUTPUT.PUT_LINE('-----------------------');


   OPEN C1;

LOOP

  FETCH C1 INTO VDEPT.DEPTNO, VDEPT.DNAME, VDEPT.LOC;

  EXIT WHEN C1%NOTFOUND;

  DBMS_OUTPUT.PUT_LINE(VDEPT.DEPTNO||'  '||VDEPT.DNAME||'  '||VDEPT.LOC);   

END LOOP;


   CLOSE C1;

END;



/*

    트리거    


    테이블이 변경되면 

    이를 이벤트로 다른 테이블이 자동으로(연쇄적으로) 변경되도록 하기 위해서 

    사용합니다. 


*/


/*

사원 테이블에 새로운 데이터가 들어오면 

'신입사원이 입사했습니다.'란 메시지를 출력도록 문장 레벨 트리거로 작성해봅시다.

신입 사원의 정보를 추가할 사원 테이블을 새롭게 만들어 놓읍시다.

ED 다음에 파일이름을 입력하여 새로 생긴 SQL 파일에 

다음과 같이 입력하시오.(파일이름:TRIG01.SQL)  

*/

create or replace trigger trg_01

after insert on emp

begin

    dbms_output.put_line(' 신입사원이 입사 ');

end;


-- 만들어진 트리거 확인

select trigger_name from user_triggers


SET SERVEROUTPUT ON

INSERT INTO EMP01 VALUES(1, '전원지', '화가');



CREATE TABLE SAL01(

SALNO NUMBER(4) PRIMARY KEY,

SAL NUMBER(7,2),

EMPNO NUMBER(4) REFERENCES EMP01(EMPNO)

);


CREATE SEQUENCE SAL01_SALNO_SEQ; 


CREATE OR REPLACE TRIGGER TRG_02

AFTER INSERT 

ON EMP01

FOR EACH ROW

BEGIN 

INSERT INTO SAL01 VALUES(

SAL01_SALNO_SEQ.NEXTVAL, 100, :NEW.EMPNO); 

END;


















'IT > 오라클' 카테고리의 다른 글

create or replace table 사용하는 이유  (1) 2018.04.14
오라클 커서 설명  (0) 2018.04.14
PL/SQL 기초  (0) 2018.04.11
사용자 생성 및 권한 설정  (0) 2018.04.11
사용자 관리  (0) 2018.04.10