【问题标题】:How to Dynamically Name Table in Oracle SQL Select Statement?如何在 Oracle SQL Select 语句中动态命名表?
【发布时间】:2016-09-10 18:49:54
【问题描述】:

我想从一个表中返回所有行和字段,其中表名和字段名都事先不知道。比如:

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)

谢谢

【问题讨论】:

  • 检查包DBMS_SQL,在那里你可以做完整的动态SQL语句。

标签: sql database oracle select plsql


【解决方案1】:

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

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

  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

【讨论】:

    【解决方案2】:

    这个答案不需要任何字段类型或数字的知识。

    简短的回答是:

    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;
    

    【讨论】:

      【解决方案3】:

      我使用 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;
      

      【讨论】:

        猜你喜欢
        • 2021-01-28
        • 2013-06-30
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 2013-02-17
        • 1970-01-01
        相关资源
        最近更新 更多