Sql Insert语句返回“零/无行插入”

时间:2012-08-09 05:08:38

标签: oracle plsql insert

我正在编写一个INSERT语句,在PL / SQL块中向表中插入一行。如果此插入失败或没有插入行,那么我需要回滚先前执行的更新语句。

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

3 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:2)

是的,要了解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;

答案 2 :(得分:0)

要完成上述评论之一:

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

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

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