[ PL/SQL ]

 

- 구조적인 SQL언어와 달리 SQL을 절차적인 방식에 의해 사용하도록 설계한 언어

 

1) PL/SQL의 구조

DECLARE  -- 선언(변수선언,커서,사용자정의 예외,..)
BEGIN  -- 실행(SELECT,DML,..)
EXCEPTION -- 예외처리
END;
/

 


예1)

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2     I_MSG VARCHAR2(100); -- 변수선언
3  BEGIN
4     I_MSG:='HELLO';  -- 값대입
5     DBMS_OUTPUT.PUT_LINE('I_MSG:' || I_MSG); -- 화면출력
6  END;
7  /

 

[결과]
I_MSG:HELLO

 

SQL> DECLARE
2     VEMPNO NUMBER(4);
3     VENAME VARCHAR2(20);
4     VDEPTNO NUMBER(4);
5     VSAL NUMBER(4);
6     BONUS NUMBER(10);
7  BEGIN
8     SELECT EMPNO,ENAME,DEPTNO,SAL INTO VEMPNO,VENAME,VDEPTNO,VSAL
9     FROM EMP
10     WHERE EMPNO=7369;
11     IF(VDEPTNO=10) THEN
12             BONUS:=VSAL*0.1;
13     ELSIF(VDEPTNO=20) THEN
14             BONUS:=VSAL*0.2;
15     ELSIF(VDEPTNO=30) THEN
16             BONUS:=VSAL*0.3;
17     END IF;
18     DBMS_OUTPUT.PUT_LINE('사원번호 급여 부서번호 보너스');
19     DBMS_OUTPUT.PUT_LINE(VEMPNO ||' '||VSAL||' '||VDEPTNO||' '||BONUS);
20  END;
21  /

 

사원번호 급여 부서번호 보너스
7369 800 20 160

 

 

 

[ 저장 프로시져(Stored Procedure) ]


- 특정한 처리를 수행하는 PL/SQL 서브프로그램. 파라미터를 받아서 특정 작업을 수행한다.


- 형식)

CREATE OR REPLACE PROCEDURE 프로시져명(파라미터,..)
IS
변수선언;
..
BEGIN
실행문;
..
END;
/

 



예)-- 연습용 테이블

CREATE TABLE MEM
(
NUM NUMBER PRIMARY KEY,
NAME VARCHAR2(20),
PHONE VARCHAR2(15),
ADDR VARCHAR2(20)
);

 

예1) 프로시져만들기

CREATE OR REPLACE PROCEDURE ADDMEM
(
NUM NUMBER, -- 파라미터
NAME VARCHAR2,
PHONE VARCHAR2,
ADDR VARCHAR2
)
IS
BEGIN
INSERT INTO MEM
VALUES(NUM,NAME,PHONE,ADDR);
END;
/

 

-- 프로시져 오류보기

SQL>SHOW ERROR

 

-- 프로시져 수행

SQL> EXECUTE ADDMEM(1,'홍','010','대구');

 



예2)

CREATE OR REPLACE PROCEDURE ADDMEM
(
    NUM MEM.NUM%TYPE,
    NAME MEM.NAME%TYPE,
    PHONE MEM.PHONE%TYPE:='010',-- 파라미터값이없으면 디폴트값으로 채워짐
    ADDR MEM.ADDR%TYPE:='서울'
)
IS
BEGIN
INSERT INTO MEM
VALUES(NUM,NAME,PHONE,ADDR);
COMMIT;
END;
/

 

SQL> EXECUTE ADDMEM(2,'김아무');

 

-- 예제테이블

CREATE TABLE HAKSA
(
    HAKBUN NUMBER(10) PRIMARY KEY,
    KOR NUMBER(3),
    ENG NUMBER(3),
    TOT NUMBER(3),
    HAKJUM CHAR(2)
);

 

SQL> INSERT INTO HAKSA(HAKBUN,KOR,ENG) VALUES(1,100,90);

SQL> INSERT INTO HAKSA(HAKBUN,KOR,ENG) VALUES(2,80,70);

 

 -- 학번을 파라미터로 받아서 총점과 학점을 계산해주는 저장 프로시져

CREATE OR REPLACE PROCEDURE HAKSA_PRO(NUM HAKSA.HAKBUN%TYPE)
IS
    HAK HAKSA.HAKJUM%TYPE;
    SUM1 HAKSA.TOT%TYPE;
    AVG1 NUMBER;
BEGIN
    SELECT (KOR+ENG) INTO SUM1
      FROM HAKSA
     WHERE HAKBUN=NUM;

    AVG1:=SUM1/2; --평균구하기

    -- IF절 이용해서 학점구하기
    IF(AVG1>=90) THEN
        HAK:='A';
    ELSIF(AVG1>=80) THEN
        HAK:='B';
    ELSIF(AVG1>=70) THEN
        HAK:='C';
    ELSE
        HAK:='F';
    END IF;

    UPDATE HAKSA
       SET TOT=SUM1
         , HAKJUM=HAK -- 계산된 데이터로 수정하기
     WHERE HAKBUN=NUM;
   
    COMMIT;
END;
/

 

-- 프로시져 실행하기

SQL> EXECUTE HAKSA_PRO(1);

 

 



[ 사용자 정의 함수(Stored Function) ]


- 사용자가 만든 함수이며 어떤 연산을 수행한뒤 결과값을 반환한다.


형식)

CREATE OR REPLACE FUNCTION 함수명(파라미터,..)
RETURN 리턴형
IS
변수선언;
..
BEGIN
실행문장;
..
RETURN 값;
END;
/

 



예) 입력받은 값으로부터 10%의 세율을 구하는 함수

CREATE OR REPLACE FUNCTION TAX(P_VALUE NUMBER)
RETURN NUMBER
IS
VAL NUMBER;
BEGIN
    VAL:=P_VALUE*0.1; -- 세율구하기
    RETURN VAL; --세율반환하기
END;
/

 

SQL> SELECT TAX(3000) FROM DUAL;

TAX(3000)
----------
300

 

 


## IF문 형식

IF 조건절 THEN
    실행문;
ELSE
    실행문;
END IF;

 



Q1) 사원의 급여를 파라미터로 받아서 5000이상이며 15%에 해당하는 금액을 리턴하고 5000미만이면 10%를 리턴하는 함수 작성

CREATE FUNCTION MYTAX(P_VAL NUMBER) RETURN NUMBER
IS
    V_RESULT NUMBER;
BEGIN
    IF(P_VAL>=5000) THEN
        V_RESULT:=P_VAL*0.15;
    ELSE
       V_RESULT:=P_VAL*0.1;
    END IF;

    RETURN V_RESULT;

END;
/

-- FUNCTION호출
SQL> SELECT MYTAX(6000) FROM DUAL;

MYTAX(6000)
-----------
900

 

 

Q2) 파라미터로 사원번호를 받아서 근무하는 부서명을 반환하는 함수작성

CREATE OR REPLACE FUNCTION EMPDNAME(NUM EMP.EMPNO%TYPE)
RETURN VARCHAR2  -- 반환타입
IS
    V_RESULT VARCHAR2(20); --부서명저장할 변수
BEGIN
    SELECT D.DNAME
      INTO V_RESULT
      FROM EMP E,
           DEPT D
     WHERE E.DEPTNO=D.DEPTNO
       AND E.EMPNO=NUM;
   
    RETURN V_RESULT;
END;
/

 

-- FUNCTION호출해보기

SQL> SELECT EMPDNAME(7369) FROM DUAL;




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

2. 기본  (0) 2015.02.13
1. PL/SQL 개요  (0) 2015.02.11
프로시져 실행 샘플 - OUT 값이 여러행인 경우  (0) 2015.01.21

+ Recent posts