我正在编写一个INSERT
语句以在 PL/SQL 块中的表中插入一行。如果此插入失败或未插入任何行,则我需要回滚先前执行的更新语句。
我想知道该INSERT
语句在什么情况下可以插入 0 行。如果插入由于某些异常而失败,我可以在异常块中处理它。是否存在INSERT
可能成功运行但不引发异常的情况,我需要检查是否SQL%ROWCOUNT < 1
?
如果您的INSERT
语句结构为INSERT ... VALUES
,那么它将成功插入一行或生成异常。没有必要检查SQL%ROWCOUNT
.
如果你的INSERT
语句结构为INSERT ... SELECT
,那么SELECT
语句可能会返回 0 行,INSERT
语句将插入 0 行,并且不会抛出异常。如果您认为这是一个错误,则需要在语句运行SQL%ROWCOUNT
后检查。INSERT
是的,要找出受 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;
要完成上述评论之一:
如果您在INSERT INTO ... VALUES
没有任何提示的情况下请求 DML 语句,那么系统将返回成功时创建的 1 行或失败时的 ORA 错误
但是,如果您请求INSERT INTO ... VALUES
带有提示的 DML 语句:IGNORE_ROW_ON_DUPE_KEY,那么您将创建 1 行或创建 0 行以防该行已经存在,并在其他失败的情况下出现 ORA 错误
如果您INSERT ... SELECT
按照贾斯汀的上述要求,您还可以期望创建 0 行,因为对 SELECT 的内部调用确实可以返回