|
CREATE OR REPLACE PROCEDURE P_TRACE_FK ( PC$Table IN VARCHAR2, PC$Schema IN VARCHAR2 DEFAULT USER ) IS LN$Tab PLS_INTEGER := 0 ; LC$Titre VARCHAR2(256) ; LN$L PLS_INTEGER ; PROCEDURE reference( PC$Nom_Table IN VARCHAR2, PC$Nom_User IN VARCHAR2, PN$L IN PLS_INTEGER ) ; PROCEDURE Est_reference_par( PC$Nom_Table IN VARCHAR2, PC$Nom_User IN VARCHAR2 ) IS Cursor Cur IS -- Cursor on constraints -- SELECT A1.TABLE_NAME, C1.COLUMN_NAME, C1.POSITION, B1.CONSTRAINT_NAME, A1.OWNER, a1.delete_rule FROM ALL_CONSTRAINTS A1, ALL_CONSTRAINTS B1, ALL_CONS_COLUMNS C1 WHERE A1.Constraint_Name = B1.R_Constraint_name AND A1.Owner=B1.R_Owner AND A1.CONSTRAINT_TYPE = 'P' AND C1.Table_name=B1.table_name AND C1.Constraint_Name = B1.Constraint_name AND C1.owner = B1.owner AND B1.table_name = PC$Nom_Table AND B1.owner= PC$Nom_User ORDER BY A1.Table_name, C1.Position ;
LC$NewTable VARCHAR2(30) ; LC$OldTable VARCHAR2(30) ; LN$Num PLS_INTEGER := 0 ;
BEGIN For C IN Cur Loop LC$OldTable := C.TABLE_NAME ; LC$NewTable := LC$OldTable ; LN$Num := LN$Num + 1 ; DBMS_OUTPUT.PUT_LINE( LPAD( '_' ,LN$Tab * 3,'_') || ' ' || Rpad(PC$Nom_table,31) || ' ' || 'referenced by : ' || C.POSITION || ' -> ' || INITCAP(C.COLUMN_NAME) || '.' || C.TABLE_NAME ) ; If C.TABLE_NAME <> NVL( LC$OldTable,'1' ) Then LN$Tab := LN$Tab + 1 ; Est_reference_par( C.TABLE_NAME, PC$Nom_User ) ; -- Recursive call LC$OldTable := C.TABLE_NAME ; End if ; End loop ; If LN$Num = 1 OR ( LC$OldTable = LC$NewTable ) Then LN$Tab := LN$Tab + 1 ; Est_reference_par( LC$OldTable, PC$Nom_User ) ; End if ; END ;
PROCEDURE reference( PC$Nom_Table IN VARCHAR2, PC$Nom_User IN VARCHAR2, PN$L IN PLS_INTEGER ) IS Cursor Cur IS SELECT B1.TABLE_NAME, C1.COLUMN_NAME, C1.POSITION, B1.CONSTRAINT_NAME, B1.OWNER, B1.DELETE_RULE FROM ALL_CONSTRAINTS B1, ALL_CONS_COLUMNS C1 WHERE B1.R_Constraint_Name = C1.Constraint_name AND B1.R_Owner=C1.Owner AND B1.CONSTRAINT_TYPE = 'R' AND C1.Table_name= PC$Nom_Table AND C1.owner = PC$Nom_User ORDER BY b1.owner, B1.Table_name, C1.Position;
BEGIN For C IN Cur Loop If Cur%ROWCOUNT = 1 Then DBMS_OUTPUT.PUT_LINE( RPAD( '-', PN$L, '-' ) ) ; End if ; DBMS_OUTPUT.PUT_LINE( Rpad(PC$Nom_table,31) || ' ' || 'references : ' || C.POSITION || ' -> ' || INITCAP(C.COLUMN_NAME) || '.' || C.TABLE_NAME || ' (' || C.DELETE_RULE || ')' ) ; End loop ; END ;
-- Début de la procédure -- BEGIN LC$Titre := '-- Integrity referential constraints on table : ' || PC$Table || '.' || PC$Schema || ' --' ; LN$L := Length( LC$Titre ) ; DBMS_OUTPUT.PUT_LINE( LPAD( '-', LENGTH( LC$Titre ), '-' ) ) ; DBMS_OUTPUT.PUT_LINE( LC$Titre ) ; DBMS_OUTPUT.PUT_LINE( LPAD( '-', LENGTH( LC$Titre ), '-' ) ) ; Est_reference_par( PC$Table, PC$Schema ) ; Reference( PC$Table, PC$Schema, LN$L ) ; DBMS_OUTPUT.PUT_LINE( CHR(10) ) ; END; /
|