DBMS (MySQL)/DBMS (Oracle)

[DB] PL/SQL, 프로시저(Procedure), IF문

(งᐛ)ว 2023. 10. 18. 23:22
728x90

PL/SQL _ Oracle's Procedural Language extension to SQL

오라클 SQL을 확장하여 사용하는 프로그래밍 언어 

절차지향형 프로그래밍 언어 

DECLARE ---선언부 

 

IS 

 

BEGIN  ---실행부 

쿼리문 

END; 

 

PL/SQL문을 사용하는 이유 

1. 대용량 데이터 연산이 필요할 때 서버로 전송해서 처리하려면 네트워크에 부하가 걸릴 수 있는데

    이때 함수를 사용하여 데이터를 연산하고 가공한 후에 결과만 서버로 전송하면 부담을 줄일 수 있다. 

2. 로직을 수정하기 위해 서버를 셧다운시킬 필요가 없다. 

3. 쿼리문을 직접 노출하지 않는 만큼 SQL injection 의 위험이 줄어든다. (SQL injection : 해킹의 한 형태)

 

 

 

프로시저(PROCEDURE)

PL/SQL문의 대표적인 부 프로그램 

데이터베이스에 대한 일련의 작업을 정리한 절차를 RDBMS에 저장한 것

일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합 

프로시저를 호출하면 내부적으로 PL/SQL 코드가 실행됨 

CREATE OR REPLACE PROCEDURE 프로시저명 ( 

     매개변수1 IN 타입 := 값, 

     매개변수2 IN 타입 %TYPE 

IS 

     함수 내에서 사용할 변수 선언 

BEGIN 

     실행할 명령 

END; 

 

사용법

CALL 프로시저명 (값1, 값2 ... )

 

장점

하나의 요청으로 여러 SQL문 실행 가능

네트워크 소요시간을 줄여 성능개선 가능

단점

문자나 숫자연산에 사용하면 오히려 C나 JAVA보다 느린 성능

쉽지 않은 유지보수

 


 

--간단한 프로시저 만들어보기

--F(X) = 2X + 1;

--F는 프로시저명, X가 매개변수, 결과값은 2X+1

 

CREATE OR REPLACE PROCEDURE F(

     X IN NUMBER

)

IS --변수는 필요없어서 안씀

BEGIN

     DBMS_OUTPUT.PUT_LINE(2*X+1); --콘솔에 찍고싶다면 PUT_LINE

END;

 

CALL F(3);

 

 

 

 

JOBS 테이블에 데이터를 INSERT해주는 프로시저 만들기 (변수명 : MY_NEW_JOB_PROC)

 

CREATE OR REPLACE PROCEDURE MY_NEW_JOB_PROC(

     --JOBS테이블에 INSERT하기 위해서는 컬럼 4개에 대한 값이 필요함

     P_JOB_ID IN JOBS.JOB_ID%TYPE,

     P_JOB_TITLE IN JOBS.JOB_TITLE%TYPE,

     P_MIN_SALARY IN JOBS.MIN_SALARY%TYPE,

     P_MAX_SALARY IN JOBS.MAX_SALARY%TYPE

)

IS

BEGIN

     INSERT INTO JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)

     VALUES(P_JOB_ID, P_JOB_TITLE, P_MIN_SALARY, P_MAX_SALARY);

     DBMS_OUTPUT.PUT_LINE('ALL DONE ABOUT'||' '||P_JOB_ID);

END;

 

CALL MY_NEW_JOB_PROC('IT','Developer',14000,20000);

 

SELECT * FROM JOBS;

기존 -> CALL 이후

 

 

 

JOBS 테이블에 데이터를 INSERT 하거나

INSERT하고자 하는 데이터가 이미 존재한다면 UPDATE해주는 프로시저 만들기 (변수명 : MY_NEW_JOB_PROC)

 

CREATE OR REPLACE PROCEDURE MY_NEW_JOB_PROC(

     --JOBS테이블에 INSERT하기 위해서는 컬럼 4개에 대한 값이 필요함

     P_JOB_ID IN JOBS.JOB_ID%TYPE,

     P_JOB_TITLE IN JOBS.JOB_TITLE%TYPE,

     P_MIN_SALARY IN JOBS.MIN_SALARY%TYPE,

     P_MAX_SALARY IN JOBS.MAX_SALARY%TYPE

)

IS

     CNT NUMBER := 0; --카운트넘버를 0으로 초기화

BEGIN

     SELECT COUNT(JOB_ID) INTO CNT

     FROM JOBS WHERE JOB_ID = P_JOB_ID;

 

     IF CNT = 0 THEN --중복값이 없다면 아래 INSERT 쿼리문 그대로 실행

          INSERT INTO JOBS(JOB_IDJOB_TITLEMIN_SALARYMAX_SALARY)

          VALUES(P_JOB_IDP_JOB_TITLEP_MIN_SALARYP_MAX_SALARY);

          DBMS_OUTPUT.PUT_LINE('INSERT DONE ABOUT'||' '||P_JOB_ID); --기존 INSERT 구문 

     ELSE --중복값이 있다면

          UPDATE JOBS --update로 갱신함

          SET JOB_TITLE = P_JOB_TITLE,

          MIN_SALARY = P_MIN_SALARY,

          MAX_SALARY = P_MAX_SALARY --마지막은 반점 없음

          WHERE JOB_ID = P_JOB_ID;

          DBMS_OUTPUT.PUT_LINE('UPDATE DONE ABOUT'||' '||P_JOB_ID);  --새로운 UPDATE 구문 

     END IF;

END;

 

CALL MY_NEW_JOB_PROC('IT','Developer',5000,10000);

 

SELECT * FROM JOBS;

INSERT -> UPDATE

 

 

 

JOBS 테이블에서 지정하는 내용과 일치하는 조건의 행을 DELETE하는 프로시저 만들기 (변수명 : DEL_JOB_PROC)

 

CREATE OR REPLACE PROCEDURE DEL_JOB_PROC(

     P_JOB_ID IN JOBS.JOB_ID%TYPE --매개변수로 하나만 지정한 행을 삭제할 것이기 때문에

                                                                               INSERT, UPDATE와 달리 하나의 매개변수만 두어도 무관 

)

IS

     CNT NUMBER := 0;--카운트넘버를 0으로 초기화

BEGIN

     SELECT COUNT(JOB_ID) INTO CNT

     FROM JOBS WHERE JOB_ID = P_JOB_ID;

 

     IF CNT = 1 THEN -- 1 또는 !=0

          DELETE FROM JOBS WHERE JOB_ID = P_JOB_ID; --위에서 지정한 매개변수로 DELETE

          DBMS_OUTPUT.PUT_LINE('DELETE DONE ABOUT'||' '||P_JOB_ID);

     ELSE

          DBMS_OUTPUT.PUT_LINE('NO EXIST'||' '||P_JOB_ID);

     END IF;

END; --create부터 end까지 블록지정해서 실행해보기

 

CALL DEL_JOB_PROC('IT') --매개변수가 잡아이디 하나였으므로 하나만 call

 

SELECT * FROM JOBS;

UPDATE -> DELETE

 

 


IF문 (3가지)

 

IF 조건 THEN 실행문; 

END IF; 

 

IF 조건 THEN 실행문; 

ELSE 실행문; 

END IF; 

 

IF 조건식1 THEN 실행문; 

ELSIF 조건식2 THEN 실행문; 

ELSE 실행문; 

END IF; 

 

 

 

--정수에 맞는 학점 출력하기

 

DECLARE

     SCORE NUMBER := 80; --SCORE는 변수, :=가 대입

     GRADE VARCHAR2(5);

BEGIN

     IF SCORE >=90 THEN GRADE := 'A';

     ELSIF SCORE >=80 THEN GRADE := 'B';

     ELSIF SCORE >=70 THEN GRADE := 'C';

     ELSIF SCORE >=60 THEN GRADE := 'D';

     ELSE GRADE :='F';

     END IF;

     DBMS_OUTPUT.PUT_LINE('점수 : '||SCORE||'점'||CHR(10)||'학점 : '||GRADE);

END;

 

 

 

 

요약
PL/SQL : Oracle 데이터베이스에서 사용되는 프로그래밍 언어로, 프로시저를 포함한 여러 유형의 데이터베이스 객체와 상호 작용하는 데 사용됨.
프로시저 : PL/SQL 코드로 작성된 데이터베이스 로직을 캡슐화하고 실행하는 방법 중 하나이며, PL/SQL은 이러한 프로시저를 작성하고 호출하는 데 사용되는 언어.

 

 

 

 

 

728x90

'DBMS (MySQL) > DBMS (Oracle)' 카테고리의 다른 글

[DB] NULL과 NVL  (1) 2023.10.19
[DB] 시퀀스(SEQUENCE)  (0) 2023.10.19
[DB] VIEW  (1) 2023.10.18
[DB] 서브쿼리  (1) 2023.10.17
[DB] ROLLUP과 CUBE  (0) 2023.10.17