[英]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
我進行了一些研究,但未能找到理想的解決方案。 創建視圖或存儲過程是否有幫助? 請指教。
我為您提供了一個很好的解決方案,但是您需要做兩件事:
將SQL放在PL / SQL程序單元中。 因此,是的,對於您提到的存儲過程。
在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.