'패키지(package)'는 '묶음'을 뜻하는 단어에서 유추할 수 있듯이, 오라클 데이터베이스에서 '프로시저', '펑션' 등을 한 군데에 묶어놓은 객체를 뜻합니다. 프로시저나 펑션 같이 단독으로 생성하여 사용할 수 있는 객체라고 하더라도 비슷한 성격의 객체를 한 데 묶어 더욱 효율적인 관리를 위함이지요~ 이번 시간에는 오라클 패키지를 생성, 즉 만드는 방법에 대해 안내해드리겠습니다.
오라클 패키지는 스펙(spec)과 바디(body)로 구성이 되며 변수, 프로시저, 펑션 등의 집합입니다. 스펙은 전역변수의 선언과 프로시저 및 펑션에 대한 명세를 작성하며, 바디에서 구체화 합니다. 스펙은 패키지의 명세표 라고 생각하면 되고, 바디는 스펙에 명시된 각 객체의 세부적인 구현 부분이라고 생각하면 됩니다!
Create Package
이제 패키지 생성 예제를 살펴보겠습니다~ 특정한 목적을 위한 변수, 프로시저, 펑션이 많다고 가정했을 때, 이 객체들을 하나의 패키지로 묶어둔다면 그만큼 관리하기가 편해지겠죠? '헬로 월드' 패키지를 만들어보겠습니다.
패키지 스펙에 전역변수 하나, 프로시저와 펑션을 하나를 다음과 같이 생성하였습니다.
CREATE OR REPLACE PACKAGE User_Name.Package_Name
IS
g_v_var VARCHAR2 (100) := 'Hello!';
PROCEDURE P_HELLO (p_v_arg IN VARCHAR, p_v_arg2 IN VARCHAR);
FUNCTION F_HELLO (p_v_arg IN VARCHAR, p_v_arg2 IN VARCHAR)
RETURN VARCHAR2;
END Package_Name;
/
Package created.
Create Package Body
이제 패키지 바디를 만들어보겠습니다.
프로시저 P_HELLO 는 2개의 매개변수로 하여 'Hello, Procedure' 를 출력합니다. (매개변수는 예시이며 없는 경우 아예 생략하면 됩니다.)
스펙에 명시된 변수는 PL/SQL 에서 지원하는 모든 변수를 사용할 수 있습니다~
CREATE OR REPLACE PACKAGE BODY User_Name.Package_Name
AS
PROCEDURE P_HELLO (p_v_arg IN VARCHAR, p_v_arg2 IN VARCHAR)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Hello, Procedure');
END P_HELLO;
FUNCTION F_HELLO (p_v_arg IN VARCHAR, p_v_arg2 IN VARCHAR)
RETURN VARCHAR2
IS
BEGIN
RETURN 'Hello, Function';
END F_HELLO;
END Package_Name;
/
Package body created.
Execute Package
생성한 패키지를 실행해 보도록 하겠습니다. 익명블록(anonymous block) BEGIN부터 END까지 각각 변수, 프로시저, 펑션을 실행해보겠습니다~
패키지 내의 프로시저 또한 독립하는 프로시저와 마찬가지로 EXEC 명령을 통해 실행할 수 있습니다.
익명블록에서 실행하기
BEGIN
DBMS_OUTPUT.PUT_LINE (User_Name.Package_Name.g_v_var);
User_Name.Package_Name.P_HELLO ('', '');
DBMS_OUTPUT.PUT_LINE (User_Name.Package_Name.F_HELLO ('', ''));
END;
/
Hello!
Hello, Procedure
Hello, Function
PL/SQL procedure successfully completed.
EXEC 명령어로 실행하기
EXEC User_Name.Package_Name.P_HELLO('', '');
Hello, Procedure
PL/SQL procedure successfully completed.