본문 바로가기
개발/정보처리기사

8장 SQL 응용

by hamcheeseburger 2021. 10. 9.

프로시저

SQL을 사용하여 작성한 일련을 작업을 저장해두고 호출하여 원할 때 마다 실행할 수 있도록 하는 절차형 SQL

 

정의

CREATE [OR REPLACE] PROCEDURE 프로시저이름(변수명 IN 변수타입)
IS
	변수선언
BEGIN
	sql문
    EXCEPTION
    	WHEN ,,, THEN
    		ROLLBACK;
    COMMIT;
END;
CREATE OR REPLACE emp_change(id IN int)
IS
BEGIN
	UPDATE 급여 SET 지급박식 = 'S' WHERE 사원번호 = id;
    EXCEPTION
    	WHEN PROGRAM_ERROR THEN
        	ROLLBACK;
    COMMIT;
END;

 

실행 / 삭제

EXECUTE 프로시저명(변수);

DROP PROCEDURE 프로시저명;

 

트리거

삽입, 갱신, 삭제의 이벤트가 발생하면 특정 작업이 자동으로 동작하도록 하는 절차형 sql

CREATE [OR REPLACE] TRIGGER 트리거명 [작업시점][작업종류] ON 테이블명
REFERENCING [OLD | NEW] as 임시테이블명
FOR EACH ROW
[WHEN 조건식]
BEGIN
	sql문;
END;
CREATE OR REPLACE TRIGGER 학년정보_tri BEFORE INSERT on 학생
REFERENCING NEW as 임시테이블명
FOR EACH ROW
WHEN (임시테이블명.학년 is null)
BEGIN
	:임시테이블명.학년 := '신입생';
END;

 

삭제

DROP TRIGGER 트리거명;

 

사용자 정의 함수

프로시저와 비슷하게 sql을 사용하여 일련의 작업들을 연속적으로 처리하지만, 종료 시 처리 결과로 단일 값만을 반환하는 절차형 SQL

 

CREATE [OR REPLACE] FUNCTION 함수명 (변수명 IN 변수타입)
RETURN 리턴타입
IS
	변수선언
BEGIN
	사용자 정의 함수 body;
    RETURN 반환값;
END;
CREATE OR REPLACE Get_S_성별(i_성별코드 IN int)
RETURN VARCHAR2
IS
BEGIN
	IF i_성별코드 = 1 THEN
    	RETURN '남자';
    ELSE
    	RETURN '여자';
END;

 

실행

DML에서 속성값이 놓일 부분에 사용 가능

 

삭제

DROP FUNCTION 함수명;

 

제어문

절차형 sql의 진행 순서를 변경하기 위해 사용하는 명령문

 

IF문

DECLARE
	변수선언 및 초기화;
BEGIN
	IF 조건 THEN;
    	실행문장;
    ELSE
    	실행문장;
    END IF;
END;
DECLARE
	a INT := 10;
BEGIN
	IF a >= 10 THEN
    	DBMS_OUTPUT.PUT_LINE('True');
    ELSE
    	DBMS_OUTPUT.PUT_LINE('False');
    END IF;
END;

 

LOOP문

DECLARE
	변수선언 및 초기화;
BEGIN
	LOOP
    	실행할 문장;
    EXIT WHEN 조건;
    END LOOP;
END;
DECLARE
	i INT := 0;
    sum INT := 0;
BEGIN
	LOOP
    	i := i + 1;
    	sum := sum + i;
    EXIT WHEN i >= 10;
    END LOOP;
END;

 

DECLARE
	i INT := 0;
    sum INT := 0;
BEGIN
	LOOP
    	i := i + 1;
        IF mod(i, 2) = 0 THEN
    		sum := sum + i;
        END IF;
    EXIT WHEN i >= 10;
    END LOOP;
END;

 

커서

쿼리문의 처리결과가 저장되어 있는 저장공간을 가리키는 포인터

동일한 쿼리가 반복 수행되어 DB자원을 낭비시키는 상황을 방지하고자 함

 

명시적 커서

사용자가 직접 정의해서 사용하는 커서

선언 -> 열기 -> 패치 -> 닫기 순서가 지켜져야 함

 

DECLARE
	CURSOR 커서명(변수명 변수타입, ..)
    IS
    	변수선언
    select sql문;
    
BEGIN
	OPEN 커서명(변수..);
    LOOP
    	FETCH 커서명 INTO 변수;
        변수로 진행..
    EXIT WHEN 커서명%NOTFOUND;
    END LOOP;
    CLOSE 커서명;
END;
DECLARE
	p_name employee.name%TYPE;
	CURSOR cur_name(ff INT)
    IS
    select name from employee where id >= ff;
    
BEGIN
	OPEN cur_name(20);
    LOOP
    	FETCH cur_name INTO p_name;
        DBMS_OUTPUT.PUT_LINE(p_name);
    EXIT WHEN cur_name%NOTFOUND;
    END LOOP;
    CLOSE cur_name;
END;

 

'개발 > 정보처리기사' 카테고리의 다른 글

9장 소프트웨어 개발 보안 구축  (0) 2021.10.10
10장 프로그래밍 언어 활용  (0) 2021.10.07
2장 데이터 입출력 구현  (0) 2021.10.04
7장 애플리케이션 테스트 관리  (0) 2021.10.04
6장 화면설계  (0) 2021.10.04

이전 댓글