-
PL/SQL 에서의 FUNCTION vs PROCEDURE개발/Database 2018. 8. 8. 15:19
FUNCTION 은 리턴값이 있는 서브프로그램이고,
PROCEDURE 는 리턴값이 없는 서브프로그램이다.
사실 와꾸만 써놓고 정리를 안해서 안 올리고 있지만
VBA에서나 PL/SQL에서나 FUNCTION과 PROCEDURE 의 차이점은 거의 비슷하다....
(내가 잘 몰라서 똑같다고는 말 못함)
직접 짜다보니 왜 프로그램이라는 명칭을 붙여줬는지 이해가 간다.
잘 써먹으면 정말 쪼그마한 프로그램 하나를 붙여서 쓰는 효과가 나기에...ㅎ 뭔소리야
아무튼 거의 2년간 PL/SQL을 만질 일이 없어서 까먹고 있다가 오랜만에 구문 보면서 짜려니
다른 분들의 설명이 잘 눈에 안 들어와서 내 맘대로 다시 정리한다.
오늘도 출처는 훌륭한 구루비 선생님
http://www.gurubee.net/lecture/1342
http://www.gurubee.net/lecture/1044
1. PL/SQL 블록 구조
Declarative Section(선언부)
- 변수, 상수, CURSOR, USER_DEFINE Exception 선언
Executable Section(실행부)
- SQL, 반복분, 조건문 실행
- 실행부는 BEGIN으로 시작하고 END로 종료
- 실행문은 프로그램 내용이 들어가는 부분으로서 필수적으로 사용
- Function 의 경우에는 END를 선언하기 전에 RETURN문을 써서 반환한 결과값을 명시
Exception Handling Section(예외처리)
- 예외에 대한 처리
- 일반적으로 오류를 정의하고 처리하는 부분으로 선택 사항
2. PL/SQL 프로그램의 작성 요령
- PL/SQL 블록내에서는 한 문장이 종료할 때마다 세미콜론(;)을 사용
- END뒤에 세미콜론(;)을 사용하여 하나의 블록이 끝났다는 것을 명시
- DECLARE나 BEGIN이라는 키워드로 PL/SQL블럭이 시작
- 단일행 주석 : --
여러행 주석 : /* */
- PL/SQL 블록은 행에 / 가 있으면 종결
3. 변수 선언
스칼라 데이터 타입
일반 단일 데이터 타입 변수
- 초기값 할당 연산자 (:=) 사용하여 정의
- 상수로 지정하고 싶으면 CONSTANT라는 키워드를 명시하면서 초기값을 할당
- NOT NULL이 정의되어 있으면 초기값을 반드시 지정
- 초기값 미지정 시 변수는 NULL값을 가짐
- 한 줄에 한 개의 변수 정의
- 예)
--V_PRICE 라는 이름의 숫자형 상수 선언
V_PRICE CONSTANT NUMBER(4, 2) := 12.34;
--V_NAME 이라는 이름의 문자형 변수 선언
V_NAME VARCHAR2(20);
%TYPE 데이터형 변수
- <변수명> <DB명>.<컬럼명>%TYPE;
- 이미 선언된 다른 변수 또는 데이터베이스 컬럼의 데이터 타입을 이용하여 선언
- DB 컬럼의 정의를 정확히 알지 못하는 경우에도 사용 가능하고,
DB 컬럼 정의가 변경되어도 다시 PL/SQL을 수정할 필요가 없음
- 예)
--V_ENAME 이라는 이름으로 EMP 테이블의 ENAME 컬럼과 같은 데이터 타입을 사용하는 변수 선언
V_ENAME EMP.ENAME%TYPE;
--V_SAL 이라는 이름으로 EMP 테이블의 SAL 컬럼과 같은 데이터 타입을 사용하는 변수 선언
V_SAL EMP.SAL%TYPE;
복합 데이터 타입
%ROWTYPE
- 하나 이상의 데이터값을 갖는 데이터 타입. 배열과 비슷한 역할을 하고 재사용 가능함
- 테이블이나 뷰 내부의 컬럼 데이터형, 크기, 속성 등을 그대로 사용 가능
테이블
- 일종의 일차원 배열.
레코드
- 여러 개의 데이터 타입을 갖는 변수들의 집합
예) 함수 생성 예제
FC_UPDATE_SAL 이라는 이름의 함수 생성
파라미터는 숫자 타입의 V_EMPNO 를 받음
PL/SQL 내에서는 V_SAL 이라는 이름의 변수를 사용하며, 이 변수의 타입은 EMP 테이블의 SAL 컬럼과 같은 데이터 타입 사용
함수 실행 결과 반환값으로 숫자형 변수를 리턴함
CREATE OR REPLACE FUNCTION FC_UPDATE_SAL
(V_EMPNO IN NUMBER)
RETURN NUMBER
IS
V_SAL EMP.SAL%TYPE;
BEGIN
UPDATE EMP
SET SAL = SAL * 1.1
WHERE EMPNO = V_EMPNO;
COMMIT;
SELECT SAL
INTO V_SAL
FROM EMP
WHERE EMPNO = V_EMPNO;
RETURN V_SAL;
END;
/
'개발 > Database' 카테고리의 다른 글
데이터베이스의 SYNONYM 은 뭐하는 놈일까 (0) 2018.09.07 PL/SQL 실행 블럭에서 동적 쿼리 작성하기 (0) 2018.08.08 오라클 DB 테이블스페이스 용량 늘리기 (0) 2018.08.02 SQL을 활용해서 스네이크 케이스를 카멜 케이스로 바꾸기 (0) 2018.07.26 나도 WITH절을 써보자 (0) 2018.07.26 댓글