使用过程创建 table as select 语句
Create table as select statement using procedure
首先我有如下 3 个模式(MEDICINE、MEDICINE1、MEDICINE2)。
MEDICINE 和 MEDICINE1 具有相同的 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;
/
首先我有如下 3 个模式(MEDICINE、MEDICINE1、MEDICINE2)。 MEDICINE 和 MEDICINE1 具有相同的 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;
/