使用过程创建表作为选择语句

Posted

技术标签:

【中文标题】使用过程创建表作为选择语句【英文标题】:Create table as select statement using procedure 【发布时间】:2016-01-07 09:06:03 【问题描述】:

首先,我有 3 个架构如下(MEDICINE、MEDICINE1、MEDICINE2)。 MEDICINEMEDICINE1 有相同的表,MEDICINE 有更新数据,MEDICINE1 有旧数据。我有 MEDICINE2 没有表格,所以我想在 MEDICINE2 中创建表格作为从 MEDICINE 中选择而不在 MEDICINE1 >.

例如。 create MEDICINE2.table1 as ( select * from MEDICINE.table1 minus select * MEDICINE1.table1 ) 因此,如果架构 MEDICINE 中的 table1 有数据 (1,2,3,4,5,6) 而 MEDICINE1 有 (1,2,3,4) 那么 table1 将在 MEDICINE2 中创建数据 (5,6)

因为我有很多表,所以我创建了这个过程:

CREATE OR REPLACE PROCEDURE SYSTEM.create_table_from_schema IS
 TYPE own_array IS TABLE OF VARCHAR2(40)
    INDEX BY binary_integer;
 TYPE tab_array IS TABLE OF VARCHAR2(40)
    INDEX BY binary_integer;
  v_dml_str VARCHAR2 (400);
  v_own_array    own_array;
  v_tab_array    tab_array;
BEGIN

  SELECT owner,table_name,BULK COLLECT
    INTO v_own_array,v_tab_array
    from SYS.all_tables  
  where global_stats='YES'
  And owner = 'MEDICINE';


  FOR i IN v_tab_array.first..v_tab_array.last LOOP
    v_dml_str := 'Create table MEDICINE2.'
                 ||v_tab_array(i)||'as (select * from '||v_own_array(i)||'.'|| v_tab_array(i)
                 ||' minus select * from MEDICINE1.'|| v_tab_array(i)||' )'  ;             
    EXECUTE IMMEDIATE v_dml_str;
  END LOOP;
END;
/

但有错误会显示

PROCEDURE SYSTEM.CREATE_TABLE_FROM_SCHEMA 在线:11 PL/SQL: ORA-00904: "BULK": 无效标识符

程序是否有错误?

感谢和尊重,

【问题讨论】:

在 SELECT 语句中删除 , 之前的逗号 BULK COLLECT 谢谢@Hawk,我没看到。现在它的工作 @hawk 现在当我尝试执行时会显示错误,ORA-00904: : invalid identifier ORA-06512: at "SYSTEM.CREATE_TABLE_FROM_SCHEMA", line 22 ORA-06512: at line 2 【参考方案1】:

这是您可以使用的另一种方式。以系统用户身份转到 SQL 提示符。执行这个:

SET SERVEROUTPUT ON;
Declare
  v_dml_str VARCHAR2 (400);
  cursor c1 is
     SELECT owner,table_name
     from SYS.all_tables  
     where global_stats='YES'
     and owner = 'MEDICINE';
BEGIN

   FOR i in c1
   LOOP
    v_dml_str := 'Create table MEDICINE2.'
                 ||i.table_name||' as (select * from '||i.owner||'.'|| i.table_name
                 ||' minus select * from MEDICINE1.'|| i.table_name||' );'  ;             
    --EXECUTE IMMEDIATE v_dml_str;
    DBMS_OUTPUT.put_line(v_dml_str);
  END LOOP;
END;
/

现在复制并执行生成的脚本。

【讨论】:

我使用前一个,并从 (||' 减去 select * from MEDICINE1.'|| i.table_name||' );'中删除分号;) 现在一切正常【参考方案2】:

使用以下代码。它将执行没有任何错误

CREATE OR REPLACE PROCEDURE SYSTEM.create_table_from_schema IS
  v_dml_str VARCHAR2 (400);
  v_own_array     VARCHAR2(128);
  v_tab_array   VARCHAR2(128);
  cursor c1 is
     SELECT owner,table_name
    from SYS.all_tables  
  where global_stats='YES'
  And owner = 'MEDICINE';
BEGIN

   FOR i in c1
   LOOP
    v_dml_str := 'Create table MEDICINE2.'
                 ||i.table_name||' as (select * from '||i.owner||'.'|| i.table_name
                 ||' minus select * from MEDICINE1.'|| i.table_name||' )'  ;             
    EXECUTE IMMEDIATE v_dml_str;
  END LOOP;
END;
/

【讨论】:

谢谢,但它给出了一个错误。第 1 行出现错误:ORA-00904: : 标识符无效 ORA-06512: 第 15 行 现在它在我删除 (EXECUTE IMMEDIATE v_dml_str;) 后工作,并且执行没有任何错误。但未创建表 如果没有这个语句 EXECUTE IMMEDIATE v_dml_str;无法创建表。但我没有收到任何错误。请分享错误。 这是 (EXECUTE IMMEDIATE ) ORA-00904: : invalid identifier ORA-06512: at "SYSTEM.CREATE_TABLE_FROM_SCHEMA", line 15 ORA-06512: at line 2 的错误 我没有收到任何错误。忘记之前的解决方案,找到我提供的另一个答案。【参考方案3】:

一切正常

SET SERVEROUTPUT ON;
Declare
  v_dml_str VARCHAR2 (400);
  cursor c1 is
     SELECT owner,table_name
     from SYS.all_tables  
     where global_stats='YES'
     and owner = 'MEDICINE';
BEGIN

   FOR i in c1
   LOOP
    v_dml_str := 'Create table MEDICINE2.'
                 ||i.table_name||' as (select * from '||i.owner||'.'|| i.table_name
                 ||' minus select * from MEDICINE1.'|| i.table_name||' )'  ;             
    EXECUTE IMMEDIATE v_dml_str;
            END LOOP;

END;
/

【讨论】:

@Md.ShamimAlMamun 我不知道,正如我告诉你的那样,它给了我错误,但现在当我采取最后一个解决方案时,你让我发现了错误并解决了它,所以现在它正在工作,谢谢你,你帮助我

以上是关于使用过程创建表作为选择语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server存储过程中使用表值作为输入参数示例

如何使用plsql导出oracle数据建表语句,存储过程,视图.以及表中数据

SQL语句中,查询一个结果,满足表1的A条件,满足表2的B条件,怎么写?

如何导出存储过程函数包和触发器的定义语句?如何导出表和索引的创建语句?

请问打开或创建表的sql语句是啥

使用 jdbc 语句创建和选择语句