Oracle 从PLSQL中的查询创建表

Oracle 从PLSQL中的查询创建表,oracle,dynamic,plsql,Oracle,Dynamic,Plsql,由于执行复杂查询需要很长时间,所以我想创建一个表以备将来使用,所以我不想再次执行它。所以我的想法是,我想通过向表中插入查询结果来创建一个表。 下面是我的示例代码。这不管用,这只是我的主意。谢谢 DECLARE with tab_emp as ( select * from employees ), tab_dept as (select * from departments) procedure create_tab_from_qu

由于执行复杂查询需要很长时间,所以我想创建一个表以备将来使用,所以我不想再次执行它。所以我的想法是,我想通过向表中插入查询结果来创建一个表。 下面是我的示例代码。这不管用,这只是我的主意。谢谢

DECLARE
   with tab_emp as (    
    select * from employees
    ),
    tab_dept as 
    (select * from departments)
   
    procedure create_tab_from_query IS 
    begin
        EXECUTE IMMEDIATE ('create table mytest as  select * from '|| tab_emp || ' where 1=0');
    end create_tab_from_query;
BEGIN
    create_tab_from_query;
    dbms_output.put_line(abc);
END;
/
这项工作:

SQL> with t2 as (select * from t) select * from t2;

L     A
--------- ------------------------------------------------------
RUS       Русский
但不能在CREATETABLE语句中使用希望使用的WITH。 这是行不通的:

SQL> with t2 as (select * from t) create table t3 as select * from t2;
with t2 as (select * from t) create table t3 as select * from t2
                             *
ERROR at line 1:
ORA-00928: missing SELECT keyword
您应该尝试更简单的方法,而不使用
子句:

SQL> create table t3 as select * from t;

Table created.
在您的例子中,PL/SQL代码可以通过以下方式简化:

SQL> --
SQL> BEGIN
  2     EXECUTE IMMEDIATE ('
  3      create table mytest as select * from employees where 1=0');
  4      dbms_output.put_line('abc');
  5  END;
  6  /
abc

PL/SQL procedure successfully completed.

将整个查询放入executeimmediate(作为字符串)…tab_emp是一个游标。不能简单地在字符串连接中使用它。不过,您可以将整个游标SQL放在字符串中,然后它就可以工作了,前提是您获得了所有的权限和访问权限。你是否应该是一个不同的故事。像这样的表格对于临时使用是有用的,但是如果你想保留它,也许你实际上是在寻找一个视图?这里有很多关于技术解决方案的讨论,但我不禁想知道这是否只是另一个“x-y问题”。从您的描述中,我觉得您需要的只是一个物化视图,而不是跳转到“在pl/sql中创建一个表”中。您确定您一直在解决OP的问题吗?OP询问“在PLSQL中创建表”……您是对的,但是如果用于创建表的SQL语句是无效的SQL语句,那么尝试在PL/SQL中创建表是没有意义的。首先正确地使用SQL语句,然后如果需要,可以在PL/SQL中动态地构建它。只要您知道:)也许您可以在回答的开头提到这一点..为了让事情更清楚。好的,我在PL/SQL中添加了一个解决方案。