使用过程创建表作为选择语句
Posted
技术标签:
【中文标题】使用过程创建表作为选择语句【英文标题】:Create table as select statement using procedure 【发布时间】:2016-01-07 09:06:03 【问题描述】:首先,我有 3 个架构如下(MEDICINE、MEDICINE1、MEDICINE2)。 MEDICINE 和 MEDICINE1 有相同的表,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 我不知道,正如我告诉你的那样,它给了我错误,但现在当我采取最后一个解决方案时,你让我发现了错误并解决了它,所以现在它正在工作,谢谢你,你帮助我以上是关于使用过程创建表作为选择语句的主要内容,如果未能解决你的问题,请参考以下文章
如何使用plsql导出oracle数据建表语句,存储过程,视图.以及表中数据
SQL语句中,查询一个结果,满足表1的A条件,满足表2的B条件,怎么写?