我正在使用此代码输出一些表格数据。
select uID, ColumnName, ColumnResult
from TABLE
unpivot
(
ColumnResult
for ColumnName in (COL1,COL2,COL3)
)u
我的问题是我必须输入每一列,而我的一些表有100多行。编写每一列(Col1,Col2,Col3等)非常繁琐。有没有办法动态获取所有列名并将它们放在'IN'语句中?
答案 0 :(得分:1)
您可以创建一个生成sql字符串的过程,然后执行该字符串。这是一个示例解决方案:
CREATE OR REPLACE procedure dynamic_unpivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select id, columnName, columnResult
from yourtable ';
sql_unpiv varchar2(50) := null;
begin
for x in (select t.column_name ls
from user_tab_columns t
where t.table_name = 'YOURTABLE'
and t.column_name not in ('ID'))
loop
sql_unpiv := sql_unpiv ||
' '||x.ls||' ,';
dbms_output.put_line(sql_unpiv);
end loop;
sql_query := sql_query || 'unpivot
(
columnResult
for columnName in ('||substr(sql_unpiv, 1, length(sql_unpiv)-1)||')
)';
dbms_output.put_line(sql_query);
open p_cursor for sql_query;
end;
/
然后您可以使用以下命令执行结果(我的样本来自TOAD):
variable x refcursor
exec dynamic_unpivot(:x)
print x;