2013-04-30 48 views
0

我正在使用此代碼來輸出一些表數據。如何動態獲取列名並使用它們

select uID, ColumnName, ColumnResult 
from TABLE 
unpivot 
(
ColumnResult 
for ColumnName in (COL1,COL2,COL3) 
)u 

我的問題是我必須鍵入每一列,我的一些表格有100 +行。編寫每一列(Col1,Col2,Col3等)可能非常繁瑣。是否有辦法動態獲取所有列名並將它們放入「IN」語句中?

+0

展鵬對SQL服務器的HTTP很好的插件:// WWW .red-gate.com/products/sql-development/sql-prompt /他們確實有一些針對Oracle的插件,但不知道他們是否有類似SQL提示符,可以與他們覈對。 – HaBo 2013-04-30 21:10:54

回答

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; 
/

然後,你可以使用以下方法來執行結果(我的樣本是蟾蜍):

variable x refcursor 
exec dynamic_unpivot(:x) 
print x; 
相關問題