변수, 상수, 프로시저, 함수, 서브 프로그램 등의 항목을 묶어놓은 객체이다.
패키지는 컴파일을 거쳐서 실행되며, 다른 패키지를 참조 실행할 수 있다.
패키지는 선언부, 본문, 실행부로 이루어져있다.
모듈화
함수와 프로시저등을 한 곳에 모아서 사용할 수 있으므로 관리 및 사용에 수월
캡슐화
선언부만 외부에 공개되고, 본문은 감춰져 있기 때문에 접근을 제어하여 오용을 방지
성능
패키지의 서브 프로그램 호출 시 패키지 전체가 메모리에 올라가 다른 서브 프로그램 호출 시 훨씬 나은 성능을 보입니다.
CREATE OR REPLACE PACKAGE [패키지 이름]
AS
FUNCTION 함수이름(
파라미터1이름 타입,
파라미터2이름 타입
)
RETURN 타입;
PROCEDURE 프로시저이름 (
파라미터명1 입출력 타입,
파라미터명2 입출력 타입,
)
END 패키지이름;
CREATE OR REPLACE PACKAGE BODY 패키지이름
AS
FUNCTION 함수이름(
파라미터1이름 타입,
파라미터2이름 타입
)
RETURN 타입;
IS
변수선언
BEGIN
실행문
RETURN 반환값;
END;
PROCEDURE 프로시저이름 (
파라미터명1 입출력 타입,
파라미터명2 입출력 타입,
)
IS
변수선언
BEGIN
실행문
RETURN 반환값;
END;
END 패키지이름;
예외처리는 꼭 SQL에서 처리할 필요는 없고, 자바와 같은 프로그래밍 언어에서 처리 해도 된다.
EXCEPTION WHEN 예외명 THEN 예외처리 --예외명을 알 경우
WHEN OTHERS THEN 예외처리 --예외명을 모를 경우
-- SQLCODE : 오류코드 반환
0 : 정상
100 : no data found 오류
1 : (기본값)사용자 정의 예외의 경우
음수 : 오류코드
-- SQLERRM : SQLCODE에 해당하는 오류 메시지 반환
SELECT 패키지이름.함수(파라미터값)
FROM 테이블이름;
--- OR
BEGIN
패키지이름.프로시저(파라미터)
END;
패키지 내 함수와 프로시저 검색하기
SELECT *
FROM ALL_PROCEDURES
WHERE OBJECT_NAME = "패키지이름";
SET SERVEOUTPUT ON; -- DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용
-- 패키지 실행
VARIABLE RESULT VARCHAR2;
EXEC :RESULT := EX_PKG.FUNC_1(10);
PRINT :RESULT;
EXEC EX_PKG.PROC_1;
EXEC EX_PKG.PROC_2(10);
ORACLE에서 쿼리 실행 전 프로그램 커서를 생성한다. 프로그램은 커서에 대해 파싱할 SQL을 참조하여,
SQL에 의해 참조된 바인드 변수에 대해서 값을 바인딩한다.
참조 블로그
https://coding-factory.tistory.com/454 -- 예외처리
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=giriyo&logNo=221368705446 -- SQLCODE, SQLERRM 함수
https://stackoverflow.com/questions/2177978/what-does-the-colon-sign-do-in-a-sql-query -- 바인드 변수
https://fomaios.tistory.com/entry/Oracle-패키지Package란-feat-CRUD -- 오라클 패키지
https://coding-factory.tistory.com/456 -- 오라클 패키지