9

我正在编写一个INSERT语句以在 PL/SQL 块中的表中插入一行。如果此插入失败或未插入任何行,则我需要回滚先前执行的更新语句。

我想知道该INSERT语句在什么情况下可以插入 0 行。如果插入由于某些异常而失败,我可以在异常块中处理它。是否存在INSERT可能成功运行但不引发异常的情况,我需要检查是否SQL%ROWCOUNT < 1

4

3 回答 3

24

如果您的INSERT语句结构为INSERT ... VALUES,那么它将成功插入一行或生成异常。没有必要检查SQL%ROWCOUNT.

如果你的INSERT语句结构为INSERT ... SELECT,那么SELECT语句可能会返回 0 行,INSERT语句将插入 0 行,并且不会抛出异常。如果您认为这是一个错误,则需要在语句运行SQL%ROWCOUNT后检查。INSERT

于 2012-08-09T05:22:53.740 回答
3

是的,要找出受 DML 语句(INSERT、UPDATES 等)影响的行数,您可以检查SQL%ROWCOUNT

INSERT INTO TABLE
SELECT col1, col2,....
  FROM TAB;

if SQL%ROWCOUNT=0 then
   RAISE_APPLICATION_ERROR(-20101, 'No records inserted');
end if;
于 2012-08-09T05:21:18.697 回答
0

要完成上述评论之一:

  • 如果您在INSERT INTO ... VALUES没有任何提示的情况下请求 DML 语句,那么系统将返回成功时创建的 1 行或失败时的 ORA 错误

  • 但是,如果您请求INSERT INTO ... VALUES带有提示的 DML 语句:IGNORE_ROW_ON_DUPE_KEY,那么您将创建 1 行或创建 0 行以防该行已经存在,并在其他失败的情况下出现 ORA 错误

  • 如果您INSERT ... SELECT按照贾斯汀的上述要求,您还可以期望创建 0 行,因为对 SELECT 的内部调用确实可以返回

于 2019-06-26T08:54:38.223 回答