我正在使用Pl / SQL和Oracle Database 11g。
我想通过查询字符串获取带别名的列列表。
有一种方法可以使用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 :(得分:1)
可以使用Rob van Wijk的自定义视图DBA_DEPENDENCY_COLUMNS检索SQL语句中使用的列名。
将视图安装为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可能非常困难,因此它可能有助于准确解释您想要的内容以及您想要它的原因。