如何在Oracle SQL Select语句中动态命名表?

时间:2016-05-14 16:34:56

标签: sql database oracle select plsql

我想从表中返回所有行和字段,其中tablename和fieldnames都不会事先知道。类似的东西:

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

3 个答案:

答案 0 :(得分:0)

您需求中最难的部分是您要获取的列的数据类型一致性,以及列数,您希望选择的每个表名之间可能有所不同。

对于您的问题,您可以使用:

  1. 动态SQL和Global Temporary Table:仅当fieldname1和fieldname2的数据类型始终与global_temp的col1和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 :(得分:0)

我使用user_tables创建一个变量,该变量存储在表名中。

  Create procedure dynamic_tab_name(tab_name user_tables.table.name%type)
  As
     Type refc is ref cursor;
     Cur refc;
     Result varchar2(30);
    Begin
       Open cur for 'select a from'|| tab_name;
       Fetch cur into result;       
       dbms_output. put_line(result);
       Close cur;
    End;

答案 2 :(得分:-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;