Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Finden Sie Spaltennamen und Tabellennamen, auf die in SQL verwiesen wird

Ich habe eine großartige Lösung für Sie, aber es gibt zwei Dinge, die Sie tun müssen:

  1. Platzieren Sie das SQL in einer PL/SQL-Programmeinheit. Also, ja, zu der von Ihnen erwähnten gespeicherten Prozedur.

  2. Kompilieren Sie diese Programmeinheit und alle abhängigen Tabellen (d. h. installieren Sie Ihren Anwendungscode) auf einer 12.2-Instanz (Sie können 12.2 unter http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html oder Sie können einen Exadata Express Cloud Service unter cloud.oracle.com erwerben oder ein Guthaben in Höhe von 300 $ erhalten, um ihn einen Monat lang kostenlos unter cloud.oracle.com/tryit zu nutzen).

12.2 ist der Schlüssel, weil die Funktion, die Sie WIRKLICH verwenden möchten, PL/Scope heißt und ein Compiler-Tool ist, das Informationen über PL/SQL-Bezeichner (ab 11.1) und die SQL-Nutzung innerhalb von PL/'SQL (ab 12.2) sammelt.

CREATE TABLE my_data (n NUMBER)
/

ALTER SESSION SET plscope_settings='identifiers:all, statements:all'
/

CREATE OR REPLACE PROCEDURE my_procedure (n_in IN NUMBER)
   AUTHID DEFINER
IS
   l_n           my_data.n%TYPE;

   CURSOR all_data_cur
   IS
          SELECT *
            FROM my_data
      FOR UPDATE OF n;
BEGIN
   INSERT INTO my_data (n)
        VALUES (n_in);

END;
/

  SELECT idt.line,
         idt.owner || '.' || idt.object_name code_unit, 
         idt.name column_name,
         RTRIM (src.text, CHR (10)) text
    FROM all_identifiers idt, all_source src
   WHERE     idt.usage = 'REFERENCE'
         AND idt.TYPE = 'COLUMN'
         AND idt.line = src.line
         AND idt.object_name = src.name
         AND idt.owner = src.owner
         AND idt.object_name = 'MY_PROCEDURE'
ORDER BY code_unit, line
/

LINE CODE_UNIT          COLUMN_NAME TEXT  
4   STEVEN.MY_PROCEDURE N           l_n           my_data.n%TYPE;
10  STEVEN.MY_PROCEDURE N           FOR UPDATE OF n;
12  STEVEN.MY_PROCEDURE N           INSERT INTO my_data (n)

Hoffe das hilft!

Viele weitere Beispiele für PL/Scope finden Sie unter livesql.oracle.com. Suchen Sie einfach nach "pl/scope" (duh).