2017-12-22 14 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에 약간의 행운이있을 수 있습니다. 쿼리에서 앨리어스 된대로 열 이름 대신 기본 열 이름이 필요한 이유는 무엇입니까? 검색어가 더 복잡한 지 보려면 무엇을보고 싶습니까? '선택 c.col1, c.col2의 라인을 따라 서브 쿼리를 사용하여 (a.col1에서 b.col2를 선택하고 a.col3 = b.col3에서 내부 조인 table2 b) c'? – Boneist

+1

아마도이 목적을 위해 자체 파서를 작성해야 할 것입니다. 그러나 나는 호기심이 있습니다 - 당신은 그것을 위해 무엇을 필요로합니까? –

+1

나는 이것이 가능하다고 생각하지 않는다. 상상해보십시오. SELECT a.col1 || a.col2 AS ...'또는'CASE 2 col3 then col3 else as 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 구문 분석은 엄청나게 어려울 수 있으므로 정확히 원하는 것을 설명하고 원하는 이유를 설명하는 데 도움이 될 수 있습니다.