sql >> データベース >  >> RDS >> Oracle

SQLで参照されている列名とテーブル名を検索します

    私はあなたに素晴らしい解決策を持っていますが、あなたがしなければならないことが2つあります:

    1. SQLをPL/SQLプログラム・ユニット内に配置します。そうです、あなたが言及したストアドプロシージャに対してです。

    2. そのプログラムユニットとすべての依存テーブルを12.2インスタンスにコンパイルします(つまり、アプリケーションコードをインストールします)( http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html または、cloud.oracle.comでExadata Express CLoud Serviceを購入するか、cloud.oracle.com /tryitで1か月間無料で使用するために300ドルのクレジットを取得できます。

    12.2は、本当に使用したい機能がPL / Scopeと呼ばれ、PL / SQL識別子(11.1以降)およびPL /'SQL内のSQL使用状況(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)
    

    お役に立てば幸いです。

    livesql.oracle.comにPL/Scopeの例がたくさんあります。 「pl/scope」を検索するだけです(duh)。



    1. MicrosoftAccessのメモデータ型からMySQLデータ型へ

    2. MysqlでBETWEEN句を使用して英数字フィールドを使用するにはどうすればよいですか?

    3. 複数のスレッドから同時にMySQLにアクセスする方法

    4. JavaのSQL文字列の一重引用符の無効な文字