2024. 9. 24. 00:48ㆍSQL
패키지
패키지는 함수, 프로시저, 변수, 상수, 예외 등을 하나의 논리적 단위로 그룹화하여 모듈화된 코드로 묶어놓은 구조이다.
패키지는 재사용성을 높이고 코드의 유지 보수성을 향상시키며 특정 기능에 대한 인터페이스와 구현을 분리하여 캡슐화를 지원한다.
패키지의 구조
- 패키지 사양(패키지에 사용될 인터페이스 정의 / 함수, 프로시저, 변수, 상수/ 사용자에게 공개)
- 패키지 본문(사양에서 선언한 함수와 프로시저의 실제구현 / 사용자접근 X)
패키지 사양
--서버 on으로 열어주기--
set serveroutput on;
show serveroutput;
--패키지 만들기--
--패키지 사양--
create or replace package mypackage
is
v_emp_count number;
function get_emp_name(p_empno number) return varchar2;
procedure set_emp_count(p_count number);
end mypackage;
/
패키지 사양은 외부 사용자에게 공개될 수 있는 부분이다. 패키지를 만들때는 먼저 사양을 정의해주어야하는데 create pakage 패키지명의 형태로 사양을 정의해주며 그 밑에is에는 본문에서 다시 구현될 함수와 프로시저모두 사용가능한 전역변수를 정의한다.
그 후 간단하게 함수명과 파라미터, 리턴값을 정의하고 프로시저의 파라미터를 정의한다.(파라미터가 없다면 생략가능!)
패키지 본문
--패키지 본문--
create or replace package body mypackage
is
--함수구현--
function get_emp_name(p_empno number)
return varchar2
is
v_ename varchar2(50);
begin
dbms_output.put_line('v_emp_count: '|| v_emp_count);
select ename into v_ename
from emp
where empno=p_empno;
return v_ename;
end get_emp_name;
--프로시저 구현--
procedure set_emp_count(p_count number)
is
begin
v_emp_count := p_count;
end set_emp_count;
end mypackage;
/
패키지 사양에서 정의한 내용이 실제 구현되는 구간이다. 마찬가지로 create로 시작하는데 본문이라는것을 알려주기 위해 packge뒤에 body를 붙여 적는다.여기서부터는 본격적으로 함수와 프로시저에 대해 정의하면 되는데 앞서 공부했던 함수와 프로시저를 그대로 패키지에 순서대로 정의한다고 생각하면 된다.
위 쿼리는 프로시저에서 in파라미터로 직원수를 입력받고 그 결과를 함수에서 실행문으로 반환받는 구조다. 함수의 파라미터로 직원번호를 입력하면 그에 맞는 직원이름이 리턴값으로 출력되고 프로시저의 in값으로 받은 직원 수 역시 함수의 실행문으로 통해 반환받는 구조의 쿼리문이다.
패키지 호출
--패키지 사용--
declare
v_name varchar(50);
begin
mypackage.set_emp_count(100);
v_name := mypackage.get_emp_name(7788);
dbms_output.put_line('사원명'||v_name);
end;
/
패키지를 호출할때는 익명변수를 이용하여 패키지를 호출하는데, 이때 주의할점은 함수는 리턴값이 있기때문에 일반 함수를 호출할때와 동일하게 리턴값을 변수에 저장하고, 그 변수를 dbms출력문으로 호출하면 되지만, 프로시저는 리턴값이 없기때문에 패키지 그 자체로 호출해야한다. 전체 패키지명.프로시저명(파라미터 값)의 형태로 호출하면된다.
패키지 실습 및 코드연구
--패키지 실습--
--패키지 사양--
create or replace package test_p
is
v_emp_job varchar2(100);
function get_e_name(p_empno number)return varchar2;
procedure set_e_job(p_job varchar2);
end test_p;
/
--패키지 본문--
create or replace package body test_p
is
function get_e_name
(p_empno number) return varchar2
is
v_ename varchar2(100);
begin
select ename into v_ename from emp where empno=p_empno;
dbms_output.put_line('사원번호: ' || p_empno);
dbms_output.put_line('직업: '|| v_emp_job);
return v_ename;
end get_e_name;
procedure set_e_job
(p_job varchar2)
is
begin
select job into v_emp_job from emp where ename=p_job;
end set_e_job;
end test_p;
/
--패키지 사용--
declare
v_emp_name varchar2(100);
begin
v_emp_name :=test_p.get_e_name(7788);
test_p.set_e_job(v_emp_name);
dbms_output.put_line('사원이름: '|| v_emp_name);
end;
/
위의 코드와 비슷하게 쿼리를 짜봤다.
먼저, 함수 부분에서 직원번호를 입력받아 그에 맞는 직원의 이름을 출력하도록 했으며, 입력받은 파라미터의 값도 같이 출력될 수 있도록 함수의 dbms로 정의하였다. 또한 프로시저에서는 파라미터 값으로 직원의 이름을 입력하면 그에 맞는 직업이 v_emp_job이라는 변수에 저장되도록 했다. v_emp_job변수는 함수에서 출력할 것이므로 함수에서도 인식할 수 있도록 전역변수로 정의해주었다.
사실 위의 코드에서는 함수에서는 이름을 출력하고싶은건데, 프로시저에서 직업을 구하려면 직원의 이름을 출력해야한다는 아이러니가 존재한다. 이 점을 해결하기 위해 패키지의호출단계에서 이름을 한번만 적도록 변수를 이용했다.
declare절에서 이름변수를 정의한다음에 그 이름변수에 함수에서 출력되는 이름값을 저장하고 그 변수를 프로시저의 파라미터 값으로 주는것이다. 이렇게 하면 직원의 이름을 입력해야하는 프로시저의 in파라미터에 이름을 입력하지 않아도 되며, 그 해당 직원의 직원번호만 알고있어도 원하는 값을 출력할 수 있도록 했다.
학습일기
패키지...역시 제일 어렵다..사실 함수와 프로시저등등 PL/SQL의 구조를 전부 알고있어야 작성이 가능한 부분이라 어려운게 당연하지만...ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 함수와 프로시저 전부 따로따로 작성하면 그렇게 어렵진 않은데 왜 패키지에서 작성하려고만 하면 이렇게 헷갈리는지...ㅠ 그래도 코드개발하거나 연구할때 패키지만큼 또 재밌는게 없다는것도 신기하다. 어렵긴하지만..! 그만큼 짜볼수 있는 로직들이 있어서 재밌다..! 이번에는 직접 테이블부터 만들어서 패키지를 작성해보는 연습을 해야겠다..!퐈이링👽
'SQL' 카테고리의 다른 글
SQL PL/SQL 프로시저 7_ 패키지 코드실습 및 개발 (1) | 2024.09.24 |
---|---|
SQL PL/SQL 프로시저 5_ 커서와 커서활용 / 코드연구 (0) | 2024.09.23 |
SQL PL/SQL 프로시저 4_ 함수와 함수활용법/ 약간의 코드 연구 (0) | 2024.09.23 |
SQL PL/SQL 프로시저 3_ 저장 프로시저의 IN,OUT파라미터 (4) | 2024.09.22 |
SQL PL/SQL 프로시저 2_ 프로시저의 제어문과 반복문 (0) | 2024.09.20 |