--1. 패키지 내에서 테이블이 어느 프로시저에서 사용하고 있는지 정보를 출력
--2. 프로시저 위치 정보와 테이블 위치정보를 가지는 테이블 생성해서 최종적으로 데어터 추출
-- TABLE : PACKAGE_PROCEDURE_LIST, PACKAGE_TABLE_LOC_LIST
--3. 해당 쿼리를 프로젝트에 맞게 쿼리를 약간 수정해서 사용
--패키지 내 프로시저 위치 정보 테이블을 생성
CREATE TABLE PACKAGE_PROCEDURE_LIST AS
SELECT
NAME
, TYPE
, LINE
, TEXT
, OBJECT_NAME
, PROCEDURE_NAME
FROM
(
SELECT
A.NAME
, A.TYPE
, A.LINE
, TRIM(REPLACE(REPLACE(REPLACE(REPLACE(A.TEXT,'PROCEDURE',''),'(',''),' ', ''),CHR(10),'')) AS TEXT
, B.OBJECT_NAME
, B.PROCEDURE_NAME
FROM USER_SOURCE A,
(
SELECT OBJECT_NAME, PROCEDURE_NAME
FROM USER_PROCEDURES
WHERE OBJECT_NAME LIKE 'PACKAGENM%' --사용하는 패키지명
AND PROCEDURE_NAME IS NOT NULL
) B
WHERE A.NAME = B.OBJECT_NAME
AND A.TYPE = 'PACKAGE BODY'
AND UPPER(A.TEXT) LIKE '%PROCEDURE%'||B.PROCEDURE_NAME||'%'
ORDER BY A.NAME, A.LINE
)X
WHERE 1=1
AND X.TEXT = X.PROCEDURE_NAME;
-- 패키지 내에서 사용하고 있는 테이블 위치
CREATE TABLE PACKAGE_TABLE_LOC_LIST AS
SELECT /*+ PARALLEL(A 8) */ *
FROM USER_SOURCE A,
(
SELECT OBJECT_NAME
FROM USER_OBJECTS
WHERE ( OBJECT_NAME LIKE 'EMP_%' OR OBJECT_NAME LIKE 'INFO_%' ) --EMP, INFO로 시작하는 테이블 및 VIEW 검색 조건
AND OBJECT_TYPE IN ('TABLE', 'VIEW')
) B
WHERE 1=1
AND A.NAME LIKE 'PACKAGENM%'
AND INSTR(UPPER(A.TEXT), B.OBJECT_NAME ) > 0
AND NVL(TRIM(SUBSTR(UPPER(A.TEXT), INSTR(UPPER(A.TEXT), B.OBJECT_NAME )- 1 ,1)),'.') = '.'
AND TRIM(SUBSTR(UPPER(REPLACE(A.TEXT,CHR(10),'')), INSTR(UPPER(REPLACE(A.TEXT,CHR(10),'')), B.OBJECT_NAME ) + LENGTH(B.OBJECT_NAME),1)) IS NULL
AND EXISTS (
SELECT 'X'
FROM PACKAGE_PROCEDURE_LIST X
WHERE A.NAME = X.NAME
);
-- TABLE : PACKAGE_PROCEDURE_LIST, PACKAGE_TABLE_LOC_LIST을 이용하여
-- 패키지내 테이블 사용 정보를 출력
SELECT DISTINCT
PACKAGE_NM AS "패키지명"
,PROC_NM AS "프로시저명"
,TABLE_NM AS "테이블명"
,T.COMMENTS AS "테이블설명"
--,TABLE_LOC
--,PROC_LOC
--,PROC_MAXLINE
FROM
(
SELECT
A.NAME AS PACKAGE_NM
,B.PROCEDURE_NAME AS PROC_NM
,A.OBJECT_NAME AS TABLE_NM
,A.LINE AS TABLE_LOC
,B.LINE AS PROC_LOC
,MAX(B.LINE) OVER ( PARTITION BY A.NAME, A.LINE ) AS PROC_MAXLINE
FROM
PACKAGE_TABLE_LOC_LIST A
,PACKAGE_PROCEDURE_LIST B
WHERE 1=1
AND A.NAME = B.NAME
AND B.LINE <= A.LINE
)X, USER_TAB_COMMENTS T
WHERE 1=1
AND X.PROC_LOC = X.PROC_MAXLINE
AND X.TABLE_NM = T.TABLE_NAME
ORDER BY PACKAGE_NM, PROC_NM, TABLE_NM;
728x90
반응형
'DB > Oracle' 카테고리의 다른 글
| 순위함수 (0) | 2018.02.15 |
|---|---|
| 오라클 특수문자 검색 (0) | 2018.02.15 |
| RATIO_TO_REPORT() (0) | 2018.02.15 |
| NTITLE() (0) | 2018.02.15 |
| 오라클 쿼리실행 시간 체크 (0) | 2018.02.15 |