使用过程创建 table as select 语句

Create table as select statement using procedure

首先我有如下 3 个模式(MEDICINE、MEDICINE1、MEDICINE2)。 MEDICINEMEDICINE1 具有相同的 tables,MEDICINE 具有更新的数据并且 MEDICINE1 有旧数据。我有 MEDICINE2 没有 table 所以我想在 MEDICINE2 中创建 table 作为 select来自 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)

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

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 On line: 11 PL/SQL: ORA-00904: "BULK": invalid identifier

程序有没有错误?

感谢和问候,

使用以下代码。它将无任何错误地执行

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;
/

这是您可以使用的另一种方式。以系统用户身份转到 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;
/

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

这工作正常

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;
/