소스 검색
17장에서 알아봤던 것처럼 함수나 프로시저 등의 프로그램의 소스는 DBMS_SOURCE 뷰를 통해 검색할 수 있다. 따라서 제일 먼저 만들 프로그램은 매개변수로 특정 키워드를 받아 이 키워드가 포함된 소스를 출력하는 program_search_prc라는 프로시저로, USER_SOURCE 뷰의 TEXT 컬럼을 LIKE 연산자를 사용해 조회한 다음 이를 DBMS_OUTPUT.PUT_LINE으로 출력하는 기능을 수행한다.
입력
CREATE OR REPLACE PACKAGE my_util_pkg IS
-- 프로그램 소스 검색 프로시저
PROCEDURE program_search_prc (ps_src_text IN VARCHAR2);
END my_util_pkg;
결과
PACKAGE MY_UTIL_PKG이(가) 컴파일되었습니다.
이제 program_search_prc 프로시저가 추가된 my_util_pkg 본문을 만들어 보자.
입력
CREATE OR REPLACE PACKAGE BODY my_util_pkg IS
-- 프로그램 소스 검색 프로시저
PROCEDURE program_search_prc (ps_src_text IN VARCHAR2)
IS
vs_search VARCHAR2(100);
vs_name VARCHAR2(1000);
BEGIN
-- 찾을 키워드 앞뒤에 '%'를 붙인다.
vs_search := '%' || NVL(ps_src_text, '%') || '%';
-- dba_source에서 입력된 키워드로 소스를 검색한다.
-- 입력 키워드가 대문자 혹은 소문자가 될 수 있으므로 UPPER, LOWER 함수를 이용해 검색한다.
FOR C_CUR IN ( SELECT name, type, line, text
FROM user_source
WHERE text like UPPER(vs_search)
OR text like LOWER(vs_search)
ORDER BY name, type, line
)
LOOP
-- 프로그램 이름과 줄번호를 가져와 출력한다.
vs_name := C_CUR.name || ' - ' || C_CUR.type || ' - ' || C_Cur.line || ' : ' || REPLACE(C_CUR.text, CHR(10), '');
DBMS_OUTPUT.PUT_LINE( vs_name);
END LOOP;
END program_search_prc;
END my_util_pkg;
결과
PACKAGE BODY MY_UTIL_PKG이(가) 컴파일되었습니다.
그럼 위 프로시저를 사용해 부서 테이블명인 departments를 검색해 보자.
입력
BEGIN
my_util_pkg.program_search_prc ('departments');
END;
결과
CH13_COL_PKG - PACKAGE BODY - 9 : FROM departments
CH13_CUR_PKG - PACKAGE - 3 : CURSOR pc_empdep_cur ( dep_id IN departments.department_id%TYPE ) IS
CH13_CUR_PKG - PACKAGE - 5 : FROM employees a, departments b
...
...
소스를 보면 USER_SOURCE 뷰를 참조하는 커서를 돌리면서 해당 키워드가 들어간 프로그램 이름(name), 프로그램 유형(type), 소스 상의 줄 번호(line)와 프로그램 소스(text)를 DBMS_OUTPUT.PUT_LINE을 이용해 출력하고 있다. 검색할 키워드가 대문자나 소문자로 입력될 수 있으므로 이 두 가지에 대해 UPPER, LOWER 함수를 WHERE 절에 사용한 점에 주목하자.