sql >> Base de Datos >  >> RDS >> Oracle

encontrar nombres de columnas y nombres de tablas a los que se hace referencia en SQL

Tengo una gran solución para ti, pero hay dos cosas que deberás hacer:

  1. Coloque el SQL dentro de una unidad de programa PL/SQL. Entonces, sí, al procedimiento almacenado que mencionaste.

  2. Compile esa unidad de programa y todas las tablas dependientes (es decir, instale su código de aplicación) en una instancia 12.2 (puede descargar 12.2 en http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html o puede comprar un servicio Exadata Express CLoud en cloud.oracle.com u obtener un crédito de $300 para usar uno sin costo durante un mes en cloud.oracle.com/tryit).

12.2 es clave porque la función que REALMENTE desea usar se llama PL/Scope y es una herramienta de compilación que recopila información sobre los identificadores PL/SQL (a partir de 11.1) y el uso de SQL dentro de PL/'SQL (a partir de 12.2).

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)

¡Espero que eso ayude!

Muchos más ejemplos de PL/Scope en livesql.oracle.com. Simplemente busque "pl/scope" (duh).