2016-05-14 117 views
0

我想返回表中的所有行和字段,其中表名和字段名都未提前知道。喜歡的東西:如何在Oracle SQL Select語句中動態命名錶?

select * from [TABLENAME]

這另一種方法看起來很有希望,但select * from test_cursor給「試圖訪問其類型是不知道項目的行...」 https://stackoverflow.com/a/101064/209942

EXECUTE IMMEDIATE很有前途,但我讀取返回多行需要光標,我找不到示例。

首選一種非常簡單快速的解決方案(即希望避免逐行處理)。

想避免創建一個函數或過程,但也許這是不可避免的。也許我需要使用表函數?

也許類似以下內容?

CREATE OR REPLACE FUNCTION GetTable(table_name CHAR) 

BEGIN 

EXECUTE IMMEDIATE 'CREATE TABLE temp_table 
    AS (SELECT * FROM :1)' USING table_name; 

END; 

SELECT * FROM table (temp_table) 

THX

+0

格紋包[ DBMS_SQL](https://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS058),那麼您可以執行完整的動態SQL語句。 –

回答

0

的您的要求最困難的部分是數據類型一致性你想要得到列,並列,可能是不同之間的每個表名要選擇。

對於你的問題,你可以使用:

  1. 動態SQL和Global Temporary Table:只有fieldname1和fieldname2總是有數據類型匹配col1和你global_temp的COL2(必須首先創建global_temp表)。

    delete global_temp; 
    sql_stmt := 'insert into global_temp(col1,col2) 
          SELECT '|| fieldname1 || ',' || fieldname2 
          ||' FROM ' || var_table_name; 
    EXECUTE IMMEDIATE sql_stmt; 
    select * from global_temp; --do any thing with result temp table 
    
  2. dynamic SQL into records(循環每一行,得到的結果):去鏈接,搜索emp_rec

-1

這個答案並不需要的字段類型或數量的知識。

簡短的回答是:

EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')'; 

SELECT * FROM temp_table; 

長的答覆是:

DROP TABLE TEMP_TABLE; 

DECLARE table_name VARCHAR2(200); 

BEGIN 
    table_name := 'subreports'; 
    EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')'; 
END; 

SELECT * FROM temp_table; 

,或作爲程序(任何人,糾正我的語法):

create procedure GetTable (table_name in VARCHAR2(200), result_set out sys_refcursor) 
    is 
    begin 
    DROP TABLE TEMP_TABLE PURGE; 
    EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')'; 
     open result_set for select * from temp_table; 
    end;