더북(TheBook)

소스 검색

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 절에 사용한 점에 주목하자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.