0

我有大量的插入语句。

我想在执行这些行期间忽略错误,并且我不想单独包装每一行。

例子:

try
    insert 1
    insert 2
    insert 3
exception
    ...

我希望如果在插入 1 中引发异常,它将忽略它并返回执行插入 2,等等。

我该怎么做?

我在 VB 中寻找类似“Resume next”的东西。

4

3 回答 3

3

您需要INSERT使用自己的异常处理程序包装每个语句。但是,如果您有“大量”插入语句,其中任何语句都可能失败,那么我倾向于怀疑您正在错误地解决问题。这些说法是从哪里来的?你能直接从那个源系统中提取数据吗?您可以在循环中执行语句而不是列出每个语句吗?您能否先将数据加载到一组临时表中,以确保所有INSERT语句都成功(即没有约束,所有列定义为 VARCHAR2(4000) 等),然后编写一条 SQL 语句将数据移动到具有适当验证和异常处理的实际目标表?

于 2012-06-04T15:30:45.970 回答
3

如果您可以将所有插入移动到一个 sql 脚本中,然后在 sql*plus 中运行它们,那么每个插入都将自行运行,脚本将继续运行。

如果您使用的是 plsqldeveloper(您已对其进行了标记),则打开一个新的命令窗口(这与 sql*plus 运行的 sql 脚本完全相同)并将您的 staements 如下所示:

insert into table your_table values(1,'aa');
insert into table your_table values(2/0,'bb');
insert into table your_table values(3,'cc');
commit;

即使语句 (2) 会抛出一个异常,因为它不在一个块中,它会继续执行下一个命令。

更新:根据@CheranShunmugavel 评论,添加

WHENEVER SQLERROR CONTINUE NONE

在脚本的顶部(特别是如果您使用 sql*plus 存在的问题exit)。

于 2012-06-05T05:57:45.490 回答
0

使用日志错误子句使用 DML 错误日志记录避免批量插入失败中的更多信息

于 2012-06-05T09:07:59.803 回答