2017-12-22 5 views
1

Oracle Database 11gでPl/SQLを使用しています。Oracleのクエリ文字列で列とエイリアス名のリストを取得

エイリアスを持つ列のリストをクエリ文字列で取得したいとします。 dbms_sql.describe_columns2を使用してクエリのすべての列名を取得する方法がありますが、エイリアスのみを取得します。例えば

DECLARE 
    l_cursor NUMBER := dbms_sql.open_cursor; 
    l_ignore NUMBER; 
    l_desc dbms_sql.desc_tab2; 
    l_cnt NUMBER; 
BEGIN 
    dbms_sql.parse(l_cursor, 'select a.col1 column1, a.col2 column2 from table_test a', dbms_sql.native); 
    dbms_sql.describe_columns2(l_cursor, l_cnt, l_desc); 
    FOR i IN 1 .. l_cnt LOOP 
     dbms_output.put_line(l_desc(i).col_name); 
    END LOOP; 
    dbms_sql.close_cursor(l_cursor); 
END; 
/

戻り値:

column1 
column2 

クエリ内の別名と値a.col1、またはa.col2を取得する方法はありますか?

+0

dbms_sqlではありません。しかし、あなたはregexp_substrと運があるかもしれません。クエリでエイリアス化されている列名ではなく、基になる列名が必要なのはなぜですか?クエリがより複雑であるかどうかを確認したいとします。 'select c.col1、c.col2の行に沿ってサブクエリを持つ(a.col1 = b.col3上のtable1からa.col1、b.col2を選択し、a.col3 = b.col3の内部結合テーブル2b)c'? – Boneist

+1

おそらく、あなたはこの目的のために独自のパーサーを書く必要があります。しかし、私は好奇心が強いです - 何のためにそれが必要ですか? –

+1

これは可能だとは思わない。 SELECT a.col1 ||のようなクエリがあるとします。 a.col2 AS ... 'または' SELECT CASE col1 col2 then col3 else col4 end AS ... 'となります。どの列名を期待しますか? –

答えて

1

SQL文で使用される列名は、Rob van Wijkのカスタム表示DBA_DEPENDENCY_COLUMNSを使用して取得できます。

ビューをSYSおよびgrant select on dba_dependency_columns to <your user>;としてインストールします。

ビューはオブジェクトに対してのみ機能します。 SELECTステートメントでVIEWを作成すると、依存関係が利用可能になります。たとえば:

create table table_test(col1 number, col2 number); 

create or replace view test_view as 
select a.col1 column1, a.col2 column2 from table_test a; 

select referenced_column 
from sys.dba_dependency_columns 
where owner = user 
    and name = 'TEST_VIEW' 
order by 1; 

結果:

REFERENCED_COLUMN 
----------------- 
COL1 
COL2 

上記の結果は、 "列のリスト" を得ます。しかし、あなたの答えの一部はまた、 "列式"を得ることを示唆しているかもしれません。それはまったく別の仕事ですが、可能です。 SQLの解析は非常に難しいので、必要なものとその理由を正確に説明するのに役立ちます。

関連する問題