【发布时间】:2017-12-21 08:43:02
【问题描述】:
我正在运行一个 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;
【问题讨论】:
-
DROP TABLE ...是一个 DDL 命令,它会进行隐式 COMMIT,因此在您的情况下,它不是必需的。 -
@WernfriedDomscheit 这是处理这种情况的最佳方法还是我应该编写动态 sql 来处理这种情况
-
你必须使用动态SQL(即
EXECUTE IMMEDIATE '...'反正。 -
您应该始终避免使用
SQLCODE||' -ERROR- '||SQLERRM。如果您只想重新引发现有异常而不添加任何值,则只需使用raise- 尽管通常应该遵循一些其他处理,例如记录消息。如果您甚至不希望这样,那么为什么要使用荒谬的、被破坏的消息破坏一个完美的错误堆栈呢?
标签: sql oracle stored-procedures job-scheduling