PL/SQL 2: 조건문, 인서트 예제

PL/SQL 2: 조건문, 인서트 예제

단일 조건문 (IF~THEN~END IF;)

DECLARE
  vename emp.ename%TYPE;
  vdname dept.dname%TYPE;
  vdeptno emp.deptno%TYPE;
BEGIN
  SELECT ename,deptno INTO vename,vdeptno
  FROM emp
  WHERE empno=7900;
  IF(vdeptno=10) THEN
    vdname:=’영업부’;
  END IF;
  IF(vdeptno=20) THEN
    vdname:=’기획부’;
  END IF;
  IF(vdeptno=30) THEN
    vdname:=’자재부’;
  END IF;
  IF(vdeptno=40) THEN
    vdname:=’총무부’;
  END IF;
DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);
DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);
DBMS_OUTPUT.PUT_LINE(‘부서:’||vdname);
END;
/

——————————————————————-

다중 조건문(ELSE IF가 아니라 ELSIF를 사용)

DECLARE
  vename emp.ename%TYPE;
  vdname dept.dname%TYPE;
  vdeptno emp.deptno%TYPE;
BEGIN
  SELECT ename,deptno INTO vename,vdeptno
  FROM emp
  WHERE empno=7900;
  IF(vdeptno=10) THEN
    vdname:=’영업부’;
  ELSIF(vdeptno=20) THEN
    vdname:=’기획부’;
  ELSIF(vdeptno=30) THEN
    vdname:=’자재부’;
  ELSIF(vdeptno=40) THEN
    vdname:=’총무부’;
  END IF;
DBMS_OUTPUT.PUT_LINE(‘***** Result *****’);
DBMS_OUTPUT.PUT_LINE(‘이름:’||vename);
DBMS_OUTPUT.PUT_LINE(‘부서:’||vdname);
END;
/

——————————————————————-

DECLARE
   vename emp.ename%TYPE;
   vcomm emp.comm%TYPE;
BEGIN
   SELECT ename,comm INTO vename,vcomm
   FROM emp
   WHERE empno=7654;
   IF(vcomm>0) THEN
     DBMS_OUTPUT.PUT_LINE(vename||’님의 성과급은 ‘||vcomm||’입니다’);
   ELSE
     DBMS_OUTPUT.PUT_LINE(vename||’님의 성과급은 없습니다’);
   END IF;
END;
/

——————————————————————————–

프로시저

형식

CREATE OR REPLACE PROCEDURE(매개변수…)

IS

    지역변수

BEGIN

    구현

END;

/

삭제 : DROP PROCEDURE proName;

호출: CALL 프로시저명(매개변수)

프로시저에 들어가는 문법을 ‘PL’이라고 한다.

———————————–

프로시저 준비

CREATE TABLE proEmp
AS (SELECT empno,ename,job,hiredate,sal,deptno FROM emp);

로 테이블을 한 개 복사뜬다.

————————————————————–

프로시저 만들기와 인서트
CREATE OR REPLACE PROCEDURE proEmpInsert(
   vename emp.ename%TYPE,
   vjob emp.job%TYPE,
   vsal emp.sal%TYPE,
   vdeptno emp.deptno%TYPE
)
IS
BEGIN
    INSERT INTO proEmp VALUES(
           (SELECT NVL(MAX(empno)+1,1) FROM proEmp),
           vename,vjob,SYSDATE,vsal,vdeptno);
    COMMIT;
END;

/

–데이터 입력
CALL proEmpInsert(‘박문수’,’대리’,3000,10);
SELECT * FROM proEmp;

———————————————————————–

프로시저 만들기와 인서트2
–데이터 입력
CREATE OR REPLACE PROCEDURE proEmpShow(
 vempno IN emp.empno%TYPE,
  vename OUT emp.ename%TYPE,
 vjob OUT emp.job%TYPE,
 vsal OUT emp.sal%TYPE,
 vday OUT emp.hiredate%TYPE,
 vdeptno OUT emp.deptno%TYPE)
IS
BEGIN
 SELECT ename,job,sal,hiredate,deptno INTO vename,vjob,vsal,vday,vdeptno
        FROM emp
        WHERE empno=vempno;
END;
/

VARIABLE vename VARCHAR2(20);
VARIABLE vjob VARCHAR2(20);
VARIABLE vsal NUMBER;
VARIABLE vday VARCHAR2(20);
VARIABLE vdeptno NUMBER;

CALL proEmpShow(7788,:vename,:vjob,:vsal,:vday,:vdeptno);
PRINT vename;
PRINT vjob;
PRINT vsal;
PRINT vday;
PRINT vdeptno;

–프로시저는 리턴형이 없기 때문에 주소값과 매개변수를 가지고 처리한다
–OUT변수가 콜 바이 레퍼런스에 해당된다(주소 넣는다). 값을 받고 싶으면 OUT을 쓴다.
–쓰지 않으면 IN이다 (콜 바이 밸류)
–OUT을 쓰게 되면 포인터이고 IN을 쓰면 일반변수다.
–두 개 다 쓰고 싶다면 INOUT 이라고 쓰면 된다
–주소 대신에 클론을 쓰고 포인터 대신에 아웃을 쓴다