我有大量的插入语句。
我想在执行这些行期间忽略错误,并且我不想单独包装每一行。
例子:
try
insert 1
insert 2
insert 3
exception
...
我希望如果在插入 1 中引发异常,它将忽略它并返回执行插入 2,等等。
我该怎么做?
我在 VB 中寻找类似“Resume next”的东西。
我有大量的插入语句。
我想在执行这些行期间忽略错误,并且我不想单独包装每一行。
例子:
try
insert 1
insert 2
insert 3
exception
...
我希望如果在插入 1 中引发异常,它将忽略它并返回执行插入 2,等等。
我该怎么做?
我在 VB 中寻找类似“Resume next”的东西。
您需要INSERT
使用自己的异常处理程序包装每个语句。但是,如果您有“大量”插入语句,其中任何语句都可能失败,那么我倾向于怀疑您正在错误地解决问题。这些说法是从哪里来的?你能直接从那个源系统中提取数据吗?您可以在循环中执行语句而不是列出每个语句吗?您能否先将数据加载到一组临时表中,以确保所有INSERT
语句都成功(即没有约束,所有列定义为 VARCHAR2(4000) 等),然后编写一条 SQL 语句将数据移动到具有适当验证和异常处理的实际目标表?
如果您可以将所有插入移动到一个 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
)。
使用日志错误子句。使用 DML 错误日志记录避免批量插入失败中的更多信息