특징 | 프로시저 | 함수 |
---|---|---|
실행 | EXECUTE 명령어 또는 다른 PL/SQL 서브프로그램 내에서 호출하여 실행 | 변수를 사용한 EXECUTE 명령어 또는 다른 PL/SQL 서브프로그램에서 호출하여 실행하거나 SQL문에서 직접 실행 가능 |
파라미터 지정 | 필요에 따라 지정하지 않을 수도 있고 여러 개 지정할 수도 있으며 IN, OUT, IN OUT 세 가지 모드를 사용할 수 있음 | 프로시저와 같게 지정하지 않을 수도 있고 여러 개 지정할 수 있지만 IN 모드(또는 생략)만 사용 |
값의 반환 | 실행 후 값의 반환이 없을 수도 있고 OUT, IN OUT 모드의 파라미터 수에 따라 여러 개 값을 반환할 수 있음 | 반드시 하나의 값을 반환해야 하며 값의 반환은 프로시저와 달리 OUT, IN OUT 모드의 파라미터를 사용하는 것이 아니라 RETURN절과 RETURN문을 통해 반환 |
함수 생성하기
// 기본 형식
CREATE [OR REPLACE] FUNCTION 함수 이름
[(파라미터 이름1 [IN] 자료형1, 1.
파라미터 이름2 [IN] 자료형2,
...
파라미터 이름N [IN] 자료형N
)]
RETURN 자료형 2.
IS | AS
선언부
BEGIN
실행부
RETURN (반환 값); 3.
EXCEPTION
예외 처리부
END [함수 이름];
번호 | 설명 |
---|---|
1. | 함수 실행에 사용할 입력 값이 필요하면 파라미터를 지정합니다. 파라미터 지정은 생략 가능하며 필요에 따라 여러 개 정의할 수 있습니다. 프로시저와 달리 IN 모드만 지정합니다. :=, DEFAUTL 옵션으로 기본값을 지정할 수도 있습니다. |
2. | 함수의 실행 후 반환 값의 자료형을 정의합니다. |
3. | 함수의 반환 값을 지정합니다. |
// 함수 생성하기
CREATE OR REPLACE FUNCTION func_aftertax(
sal IN NUMBER
)
RETURN NUMBER
IS
tax NUMBER := 0.05;
BEGIN
RETURN (ROUND(sal - (sal * tax)));
END func_aftertax;
/
함수 실행하기
함수 삭제하기
장점 | 설명 |
---|---|
모듈성 | 서브프로그램을 포함한 여러 PL/SQL 구성 요소를 모듈화할 수 있습니다. 모듈성은 잘 묶어 둔다는 뜻으로 프로그램의 이해를 쉽게 하고 패키지 사이의 상호 작용을 더 간편하고 명료하게 해 주는 역할을 합니다. 즉 PL/SQL로 제작한 프로그램의 사용 및 관리에 큰 도움을 줍니다. |
쉬운 응용 프로그램 설계 | 패키지에 포함할 서브프로그램은 완벽하게 완성되지 않아도 정의가 가능합니다. 이 때문에 전체 소스 코드를 다 작성하기 전에 미리 패키지에 저장할 서브프로그램을 지정할 수 있으므로 설계가 수월해집니다. |
정보 은닉 | 제작 방식에 따라 패키지에 포함하는 서브프로그램의 외부 노출 여부 또는 접근 여부를 지정할 수 있습니다. 즉 서브프로그램을 사용할 때 보안을 강화할 수 있습니다. |
기능성 향상 | 패키지 내부에는 서브프로그램 외에 변수∙커서∙예외 등도 각 세션이 유지되는 동안 선언해서 공용(public)으로 사용할 수 있습니다. 예를 들어 특정 커서 데이터는 세션이 종료되기 전까지 보존되므로 여러 서브프로그램에서 사용할 수 있습니다. |
성능 향상 | 패키지를 사용할 때 패키지에 포함한 모든 서브프로그램이 메모리에 한 번에 로딩되는데 메모리에 로딩된 후의 호출은 디스크 I/O를 일으키지 않으므로 성능이 향상됩니다. |
▶︎ PL/SQL 서브프로그램의 제작∙사용∙관리∙보안∙서능 등에 좋은 영향을 끼친다.
패키지 구조와 생성
// 기본 형식
CREATE [OR REPLACE] PACKAGE 패키지 이름
IS | AS
서브프로그램을 포함한 다양한 객체 선언
END [패키지 이름];
패키지 생성하기
패키지 명세 확인하기(USER_SOURCE 데이터 사전으로 조회)
패키지 명세 확인하기(DESC 명령어로 조회)
// 기본 형식
CREATE [OR REPLACE] PACKAGE BODY 패키지 이름
IS | AS
패키지 명세에서 선언한 서브프로그램을 포함한 여러 객체를 정의
경우에 따라 패키지 명세에 존재하지 않는 객체 및 서브프로그램도 정의 가능
END [패키지 이름];
패키지 본문 생성하기
// 기본 형식
CREATE [OR REPLACE] PACKAGE 패키지 이름
IS | AS
서브프로그램 종류 서브프로그램 이름(파라미터 정의);
서브프로그램 종류 서브프로그램 이름(개수나 자료형, 순서가 다른 파라미터 정의);
END [패키지 이름];
프로시저 오버로드하기
패키지 본문에서 오버로드된 프로시저 작성하기
패키지 사용하기
패키지 이름.객체 이름;
패키지에 포함된 서브프로그램 실행하기
패키지 삭제하기
// 패키지 명세와 본문을 한 번에 삭제하기
DROP PACKAGE 패지키 이름;
// 패키지의 본문만을 삭제
DROP PACKAGE BODY 패키지 이름;