2016-05-14 112 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;