我正在运行一个oracle JOB
,它将运行PROCEDURE
到CREATE
TRUNCATE
INSERT
DROP
一些相关的表格。
这是执行此类功能的最佳方式吗?我应该在程序结束时承诺吗?
CREATE OR REPLACE Procedure PR_NAME
IS
BEGIN
CREATE TABLE TABLE_1_BAC AS SELECT * FROM TABLE1_VIA_DBLINK;
TRUNCATE TABLE TABLE_1;
INSERT INTO TABLE_1 SELECT * FROM TABLE_1_BAC;
DROP TABLE TABLE_1_BAC;
--COMMIT;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
要为当前数据创建一次TABLE_1
:
CREATE TABLE TABLE_1 AS SELECT * FROM TABLE1_VIA_DBLINK;
并为TABLE1_VIA_DBLINK
创建插入触发器,通过此触发器为新数据填充TABLE_1
,并且摆脱这个job
和procedure
似乎更可行。
当你留在这份工作中时,也许你会等待插入大量数据。
顺便说一句,如果你坚持使用这个工作,你不需要发出commit
,因为在commit
机制中已经存在一个隐含的job
。
你用什么工作? JOB
或SCHEDULER JOB
?
我没有看到任何理由DROP / CREATE表。我根本没有看到你使用中间表的原因。
简单地说
CREATE OR REPLACE Procedure PR_NAME
IS
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE_1';
INSERT INTO TABLE_1 SELECT * FROM TABLE1_VIA_DBLINK;
COMMIT;
END;
您不需要任何异常处理程序。如果是JOB
,你无论如何都不会看到这个例外。如果是SCHEDULER JOB
,您可以在视图中看到异常
*_SCHEDULER_JOB_LOG
*_SCHEDULER_JOB_RUN_DETAILS
如果你做这种操作你应该考虑基本上相同的MATERIALIZED VIEW:TRUNCATE
和INSERT INTO ... SELECT * FROM ...
不,你不需要提交。
这些命令是SQL中的DDL(数据定义语言)。因此Oracle数据库将与命令一起发出提交。
DML(数据操作语言) - 如SELECT,UPDATE,INSERT,DELETE需要提交。
在场景中,您将更新,删除和插入记录。然后运行了create table命令。插入,更新和删除的记录将被提交(保存)到数据库。