首先,我有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":无效标识符
程序中是否有错误?
感谢和尊重,
答案 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;
/