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 이라고 쓰면 된다
–주소 대신에 클론을 쓰고 포인터 대신에 아웃을 쓴다