【发布时间】:2012-05-31 03:28:39
【问题描述】:
现在我正在将数据导入并转换到 Oracle 数据库中,如下所示:
程序定期轮询特定文件夹,一旦找到文件,它就会执行一个批处理文件,该文件在 Python 和 bash 中进行一些简单的转换,然后调用 SQL*Loader 将 CSV 文件加载到临时表中。
然后,批处理脚本调用 SQL 脚本(通过 SQLPlus)进行最终转换,并将转换后的数据插入主表中以用于各自的暂存表。
这种方法的问题是在 SQLPlus 端没有错误处理,例如。如果“insert into”语句由于违反约束(或任何其他原因)而失败,它仍将继续执行 SQL 脚本中包含的其余语句。
理想情况下,如果发生任何异常,我希望回滚所有更改并将异常的详细信息插入到 etl 日志表中。
存储过程似乎很适合,因为异常处理是内置的。但是,我在语法上苦苦挣扎——特别是我如何使用我的大 SQL 脚本(它们只是 INSERT INTO、UPDATE、CREATE、DROP、DELETE 等语句的组合)并将它们放入存储过程中基本错误处理。
我希望的是:
- 一个快速而肮脏的假人指南,用于获取我令人沮丧的 PL/SQL 块并让它在存储过程中执行或
- 提供相同功能的任何替代方案(如果存储过程不合适),即。一种执行一堆 SQL 语句并在其中任何语句引发异常时回滚的方法。
关于我的尝试 - 我尝试将部分 SQL 脚本复制到存储过程中,但它们总是无法编译,并出现错误“PLS-00103 在预期以下情况之一时遇到符号”。例如。
CREATE OR REPLACE PROCEDURE ETL_2618A AS
BEGIN
DROP SEQUENCE "METER_REPORTING"."SEQ_2618";
CREATE SEQUENCE SEQ_2618;
END ETL_2618A;
Oracle 文档不是很容易访问,而且我在谷歌搜索/搜索 StackOverflow 方面运气不佳,但如果我遗漏了一些明显的东西,我深表歉意。
【问题讨论】:
-
能否请您发布您的过程代码以及 oracle 返回的确切错误消息
-
我已经提供了,请参阅帖子底部。完整的错误是:PLS-00103:在预期以下之一时遇到符号“DROP”:yadda yadda + PLS-00103:遇到符号“END”
-
我应该注意,提供的程序代码代表了我试图在程序中工作的脚本的一小部分,但我认为一个小例子比发布整个脚本更好。
-
这是一个语义细节,但您将 SQL 脚本转换为存储过程,而不是 PL/SQL 脚本。