簡體   English   中英

查找SQL中引用的列名和表名

[英]find column names and table names referenced in SQL

如何查找SQL中使用的所有表和列名? 它在ORACLE數據庫上。 下面是一個SQL示例。

SELECT 
   A.ENAME,
   A.AGE as EMP_AGE,
   B.DNAME 
FROM
   emp a,
   dept b
WHERE
   a.deptno= b.deptno

我希望輸出是這樣的

TABLENAME, COLUMNNAME
EMP, ENAME
EMP, DEPTNO
EMP, AGE
DEPT, DNAME
DEPT, DEPTNO

我進行了一些研究,但未能找到理想的解決方案。 創建視圖或存儲過程是否有幫助? 請指教。

我為您提供了一個很好的解決方案,但是您需要做兩件事:

  1. 將SQL放在PL / SQL程序單元中。 因此,是的,對於您提到的存儲過程。

  2. 在12.2實例上編譯該程序單元和所有相關表(即,安裝應用程序代碼)(可以從http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html下載12.2)或者您可以在cloud.oracle.com上購買Exadata Express雲服務,或在cloud.oracle.com/tryit上獲得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)。

我已經意識到,該解決方案不會為您提供計划的列,因此它可能並不完全需要。 它只為您提供謂詞中使用的列

select
  r.name owner
, o.name tabl 
, c.name colmn
from
sys.col_usage$ u,
sys.obj$ o,
sys.col$ c,
sys.user$ r
where
r.name='&scahme' and
o.obj# = u.obj#
and c.obj# = u.obj#
and c.col# = u.intcol#
and o.owner# = r.user#

執行計划將為您提供謂語信息。 例如,

SQL> select ename as name, job as junk
  2  from emp
  3  /

 select * from table( dbms_xplan.display_cursor( null, null, 'ADVANCED' ) )

Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   196 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1 / EMP@SEL$1

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('12.1.0.2')
      DB_VERSION('12.1.0.2')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      FULL(@"SEL$1" "EMP"@"SEL$1")
      END_OUTLINE_DATA
  */

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "ENAME"[VARCHAR2,10], "JOB"[VARCHAR2,9]

如果可以將查詢轉換為VIEW,然后使用INFORMATION_SCHEMA.VIEW_COLUMN_USAGE

這是一個例子:

假設您的資料檢視名稱是ABC

然后用這個

SELECT VIEW_NAME, TABLE_NAME, COLUMN_NAME  
FROM    INFORMATION_SCHEMA.VIEW_COLUMN_USAGE 
WHERE   VIEW_NAME = 'ABC'

讓我知道它是否有效..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM