|
--in oracle 11g env...
CREATE OR REPLACE TYPE CODE_INFO as object (
object_owner VARCHAR2(30),
object_name VARCHAR2(30),
object_subname VARCHAR2(30),
object_type VARCHAR2(30),
object_usage VARCHAR2(30),
line# NUMBER,
column# NUMBER);
/
CREATE OR REPLACE TYPE CODE_INFOS as table of code_info;
/
CREATE OR REPLACE PACKAGE PKG_PLSCOPE AS
FUNCTION source_lookup( p_string IN VARCHAR2 )
RETURN code_infos;
FUNCTION source_lookup(
p_owner IN VARCHAR2,
p_object IN VARCHAR2,
p_type IN VARCHAR2,
p_line IN NUMBER )
RETURN VARCHAR2;
FUNCTION get_impact_info(
p_owner IN VARCHAR2,
p_object IN VARCHAR2,
p_unit IN VARCHAR2 )
RETURN code_infos;
PROCEDURE print_impacts(
p_owner IN VARCHAR2,
p_object IN VARCHAR2,
p_unit IN VARCHAR2,
p_print_related_text IN BOOLEAN DEFAULT FALSE );
PROCEDURE print_impacts(
p_code_infos IN code_infos,
p_print_related_text IN BOOLEAN );
END PKG_PLSCOPE;
/
CREATE OR REPLACE PACKAGE BODY PKG_PLSCOPE AS
FUNCTION source_lookup( p_string IN VARCHAR2 )
RETURN code_infos
AS
v_string VARCHAR2(32767) := UPPER(p_string);
v_code_infos code_infos := code_infos();
BEGIN
FOR code_values IN (
SELECT code_info(
owner,
name,
to_char(NULL),
type,
'SOURCE',
line,
instr(v_string, p_string)
) code_value
FROM all_source
WHERE UPPER(text) LIKE '%'||UPPER(p_string)||'%'
)
LOOP
v_code_infos.extend;
v_code_infos(v_code_infos.last) := code_values.code_value;
END LOOP;
RETURN v_code_infos;
END;
FUNCTION source_lookup(
p_owner IN VARCHAR2,
p_object IN VARCHAR2,
p_type IN VARCHAR2,
p_line IN NUMBER )
RETURN VARCHAR2
AS
v_output VARCHAR2(32767);
BEGIN
SELECT text
INTO v_output
FROM all_source
WHERE owner = p_owner
AND name = p_object
AND type = p_type
AND line = p_line;
RETURN v_output;
END;
FUNCTION get_impact_info(
p_owner IN VARCHAR2,
p_object IN VARCHAR2,
p_unit IN VARCHAR2 )
RETURN code_infos
AS
v_code_infos code_infos := code_infos();
BEGIN
FOR code_values IN (
SELECT code_info( ai.owner,
prior_object_name,
CASE
WHEN ai.object_type IN ('PROCEDURE', 'FUNCTION')
THEN NULL
ELSE
ai.name
END,
ai.object_type,
'CALL',
cnctby_vw.line,
cnctby_vw.p_col
) code_value
FROM all_identifiers ai,
(
SELECT usage,
level,
usage_id,
usage_context_id,
PRIOR usage_id p_usage_id,
PRIOR usage_context_id prior_usagectx_id,
object_name,
name,
object_type,
type,
line,
PRIOR col p_col,
PRIOR object_name prior_object_name,
PRIOR name p_name,
PRIOR object_type prior_object_type
FROM all_identifiers
WHERE OWNER = p_owner
AND OBJECT_TYPE IN ('PACKAGE BODY', 'PROCEDURE', 'FUNCTION', 'TRIGGER', 'TYPE BODY')
AND USAGE NOT IN ('DECLARATION', 'ASSIGNMENT', 'DEFINITION')
AND TYPE IN ('PACKAGE BODY', 'FUNCTION', 'PROCEDURE', 'TYPE', 'TYPE BODY')
CONNECT BY PRIOR usage_id = usage_context_id
AND PRIOR name = p_object
AND name = p_unit
AND prior usage_context_id != 0
) cnctby_vw
WHERE ai.usage_id = cnctby_vw.prior_usagectx_id
AND ai.object_name = cnctby_vw.prior_object_name
AND ai.object_type = cnctby_vw.prior_object_type
)
LOOP
v_code_infos.extend;
v_code_infos(v_code_infos.last) := code_values.code_value;
END LOOP;
RETURN v_code_infos;
END;
PROCEDURE chunk_output(
p_string IN VARCHAR2,
p_space IN VARCHAR2)
AS
BEGIN
FOR i IN 1..length(p_string) / 40
LOOP
DBMS_OUTPUT.PUT_LINE(lpad(' ', p_space) || SUBSTR(p_string, i + ((i-1) * 40), 40));
END LOOP;
END;
PROCEDURE print_impacts(
p_code_infos IN code_infos,
p_print_related_text IN BOOLEAN )
AS
v_index PLS_INTEGER;
v_output VARCHAR2(32767);
BEGIN
v_index := p_code_infos.FIRST;
LOOP
EXIT WHEN v_index IS NULL;
DBMS_OUTPUT.PUT_LINE(
'Impact to ' || p_code_infos(v_index).object_type || ' ' ||
p_code_infos(v_index).object_owner || '.' ||
p_code_infos(v_index).object_name ||
case when p_code_infos(v_index).object_subname is not null then '.' else null end ||
p_code_infos(v_index).object_subname ||
' at line ' || p_code_infos(v_index).line# ||
' and column ' || p_code_infos(v_index).column# );
IF p_print_related_text
THEN
DBMS_OUTPUT.PUT_LINE( ' TEXT: ' );
v_output := source_lookup(
p_code_infos(v_index).object_owner,
p_code_infos(v_index).object_name,
p_code_infos(v_index).object_type,
p_code_infos(v_index).line# );
chunk_output(v_output, 10);
END IF;
v_index := p_code_infos.NEXT(v_index);
END LOOP;
END;
PROCEDURE print_impacts(
p_owner IN VARCHAR2,
p_object IN VARCHAR2,
p_unit VARCHAR2,
p_print_related_text IN BOOLEAN DEFAULT FALSE )
AS
BEGIN
print_impacts( get_impact_info( p_owner, p_object, p_unit ), p_print_related_text );
END;
END PKG_PLSCOPE;
/ |
|