使用过程将表创建为select语句

时间:2016-01-07 09:06:03

标签: sql oracle plsql procedure

首先,我有3个方案如下(医学,医学1,医学2)。 Medicine MEDICINE1 有相同的表, Medicine 有更新数据, MEDICINE1 有旧数据。我有 MEDICINE2 没有表格所以我想在 MEDIC2 中创建表格,从 MEDIC 中选择 MEDIC1 >

实施例。 create MEDICINE2.table1 as ( select * from MEDICINE.table1 minus select * MEDICINE1.table1 ) 所以如果schema中的table1有数据(1,2,3,4,5,6)而MEDIC1有(1,2,3,4)那么table1将在MEDIC2中创建数据(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":无效标识符

程序中是否有错误?

感谢和尊重,

3 个答案:

答案 0 :(得分:0)

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="action-item-wrapper" data-starttime="1452157793000" data-endtime="1452157796000">Hello</div>

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这很好用

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