我正在编写一个INSERT
语句,在PL / SQL块中向表中插入一行。如果此插入失败或没有插入行,那么我需要回滚先前执行的更新语句。
我想知道INSERT
语句在什么情况下可以插入0行。如果插入因某些异常而失败,我可以在异常块中处理它。是否存在INSERT
可能成功运行但不会抛出异常的情况,我需要检查是否SQL%ROWCOUNT < 1
?
答案 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错误
但是,如果您请求带有提示的IML DML语句INSERT INTO ... VALUES
:IGNORE_ROW_ON_DUPE_KEY,那么如果该行已经存在并且ORA错误出现,则将创建1行或创建0行。其他失败的情况
,如果您如上所述按贾斯汀的要求请求INSERT ... SELECT
,您还可以期望获得0行,因为对SELECT的内部调用确实可以返回