我使用此代码来搜索表所在的所有包、触发器、函数等...
SET SERVEROUTPUT ON;
DECLARE
v_table_name VARCHAR2(100) := 'DATREDPUB';
BEGIN
FOR dep IN (SELECT NAME, TYPE, REFERENCED_TYPE
FROM USER_DEPENDENCIES
WHERE REFERENCED_NAME = v_table_name
AND REFERENCED_TYPE = 'TABLE')
LOOP
DBMS_OUTPUT.PUT_LINE( dep.NAME);
END LOOP;
END;
/
因此,我得到了所有包、触发器、函数等的列表...其中还有表中的选择或注释中的条目。然后搜索例如一桌200包很乏味。有什么方法可以找出仅执行插入或插入表的此类包、触发器、函数等?
我已经尝试过,但没有成功。
SET SERVEROUTPUT ON;
DECLARE
v_table_name VARCHAR2(100) := 'DATREDPUB';
BEGIN
FOR dep IN (SELECT NAME, TYPE, REFERENCED_TYPE
FROM USER_DEPENDENCIES
WHERE REFERENCED_NAME = v_table_name
AND REFERENCED_TYPE = 'TABLE')
LOOP
IF dep.TYPE = 'PACKAGE' THEN
DBMS_OUTPUT.PUT_LINE('Objekt: ' || dep.NAME || ', Typ: ' || dep.REFERENCED_TYPE || ', Op: PROCEDURE');
ELSIF dep.TYPE = 'TRIGGER' THEN
IF dep.NAME LIKE 'BI_%' THEN
DBMS_OUTPUT.PUT_LINE('Objekt: ' || dep.NAME || ', Typ: ' || dep.REFERENCED_TYPE || ', Op: INSERT');
ELSIF dep.NAME LIKE 'BU_%' THEN
DBMS_OUTPUT.PUT_LINE('Objekt: ' || dep.NAME || ', Typ: ' || dep.REFERENCED_TYPE || ', Op: UPDATE');
ELSIF dep.NAME LIKE 'BD_%' THEN
DBMS_OUTPUT.PUT_LINE('Objekt: ' || dep.NAME || ', Typ: ' || dep.REFERENCED_TYPE || ', Op: DELETE');
ELSE
DBMS_OUTPUT.PUT_LINE('Objekt: ' || dep.NAME || ', Typ: ' || dep.REFERENCED_TYPE || ', Op: UNKNOWN');
END IF;
END IF;
END LOOP;
END;
/
SELECT ud.NAME, ud.TYPE, ud.REFERENCED_TYPE,
src.LINE, src.TEXT
FROM USER_DEPENDENCIES ud
INNER JOIN dba_source src ON(src.NAME = ud.NAME)
WHERE ud.REFERENCED_NAME = 'LOG_TABLE' And
ud.REFERENCED_TYPE = 'TABLE' And
Upper(src.TEXT) Like Upper('%INSERT%LOG_TABLE%') Escape '\'
/* R e s u l t :
NAME TYPE REFERENCED_TYPE LINE TEXT
------ ------------ --------------- ---- ---------------------------------------
LOGGER PACKAGE BODY TABLE 61 " INSERT INTO LOG_TABLE " */
...如果您无权访问 dba_source,请使用 all_source。 all_source 将包含当前用户可以访问的存储对象