참고
2020-08-28-01)PLSQL.sql
2020-08-28-02)PLSQL2.sql
PL/SQL
- Procedural Langauge SQL
- 절차적 언어의 특징인 변수,분기문,반복문,예외처리 등의 기능이 지원된 SQL
- 모든 코드가 DB내부에 생성되고 컴파일되어 저장되기 때문에 실행 속도가 빠름
- 네트워크의 트래픽 감소
- 표준 문법이 없음
- 예외처리: 예외가 발생 되었지만 정상적으로 끝마칠수있도록 하는 것
- Anonymous Block, Store Procedure, User Defined Function(Function)
- package: 다른 객체들을 포함할 수 있다. 일련의 과정을 처리할 수 있다
- Trigger
Anonymous Block
- 기본적인 PL/SQL의 구조를 정의
- 이름이 없는 블록 -> 저장되어질 수 없다 = 재사용 제한
- 뭘 얹느냐에 따라 사용자정의함수, 저장프로시저, 패키지가 된다
선언형식
- DECLARE
선언부
BEGIN
실행부
[EXCEPTION 예외처리]
END;
예시
1. 정수형 변수에 값을 배정하고 짝수인지 홀수인지 구분하여 출력하는 익명블록을 작성하시오
1) 변수
- 다른 응용프로그램 언어의 변수 개념과 동일
- 보통 일반 변수는 'V_'로, 매개변수는 'P_'로 부여
선언형식
- 변수명 타입 [:= 초기값];
:= 대입연산자
변수의 타입
기본
- 표준 SQL에서 사용하는 타입과 동일하며 추가적으로 BOOLEAN, BINARY_INTEGER, PLS_INTEGER가 지원됨
- BOOLEAN : 논리값(TRUE,FALSE,NULL)
- BINARY_INTEGER, PLS_INTEGER : -2147483648~2147483647 까지의 정수 처리
참조타입
- 테이블명.컬럼명%TYPE
- ex) V_PD PROD.PROD_DELIVERY%TYPE;
- 테이블명%ROWTYPE
- 한 행의 타입을 전부 가지고옴 (≒ C언어의 스트럭쳐)
예시
1. 회원테이블에서 회원의 직업을 입력 받아 회원번호, 회원명 마일리지를 출력하는 익명블록 작성
- EXIT WHEN CUR_MEM%NOTFOUND;
- IS OPEN: 커서가 열렸는지 안 열렸는지
- FOUND: FETCH시 데이터가 있으면 참
- NOTFOUND: FETCH시 데이터가 없으면 참
- ROWCOUNT: 커서 안에 몇 행이 들어있는 지 출력
2) 상수
선언형식
- 식별자 CONSTANT 타입 [:= 초기값];
3) 커서
- 보통 FOR문이랑 같이 쓰임
- FOR 문이랑 같이 쓰이면 DECLARE 로 선언하지 않고 FOR문 내에서 인라인으로 커서를 선언.
- SQL 명령의 결과 집합
- 용도: '쿼리 결과'를 읽거나 수정하거나 '별도의 작업을 수행'하기위해 커서 사용
- ex) 커서로 회원ID, 이름, 마일리지를 생성시키고 해당 회원의 성별까지 출력하시오
커서 사용 단계
- ① 생성(DECLARE)
- ② 실행(BEGIN):OPEN -> FETCH -> CLOSE)
커서 선언 형식
- CURSOR 커서명[(매개변수 타입)]
IS
....SELECT 문;
- '매개변수'에 값을 배정하는 곳은 OPEN문에서 수행
- (OPEN문 뒤: 실매개변수/커서명 뒤: 가매개) -> 예전에 부르던 방식
실행영역에서
- 1) OPEN 커서명 (값 [,값,...]);
- 2) FETCH 커서명 INTO 변수명[,변수명,...];
- FETCH : 커서에 존재하는 데이터를 행단위로 읽어 변수에 저장
- '변수'는 선언부에서 선언된 변수
- 커서문 내의 SELECT 문의 SELECT절에 기술된 컬럼의 순서와 갯수, 타입이 일치
- FETCH문은 반복문 안에 기술 (바깥에 하면 맨 첫줄만 읽어오게 됨)
- 3) CLOSE 커서명;
- 사용이 종료된 커서를 닫아줌
- 한번 CLOSE되면 더 이상 접근할 수 없음
커서 속성
- 특징
- ROWCOUNT 제외 주로 조건문에 사용됨
- 묵시적 커서(Implicit Cursor)의 속성은 '커서명'대신 'SQL'이 사용됨
- 커서명%ISOPEN
- 오픈:TRUE, 클로즈:FALSE
- SQL%ISOPEN은 늘 거짓, 왜냐 바로 닫히기때문
- 커서명%FOUND
- 커서가 읽어올 자료의 존재 여부
- = 결과에 한행이라도 존재하면 TRUE
- = 커서에 포함된 SQL명령이 한번이라도 영향을 미쳤다면 TRUE
- 커서명%NOTFOUND
- 커서명%FOUND의 반대, 결과에 한행도 조회되지 않는다
- 커서명%ROWCOUNT