2012-08-09 2 views
5

Ich schreibe eine INSERT Anweisung zum Einfügen einer Zeile in die Tabelle in einem PL/SQL-Block. Wenn diese Einfügung fehlschlägt oder keine Zeile eingefügt wird, muss ich die zuvor ausgeführte Update-Anweisung zurücksetzen.Sql Insert-Anweisung zurück "Null/keine Zeilen eingefügt"

Ich möchte wissen, unter welchen Umständen die INSERT Anweisung 0 Zeilen einfügen könnte. Wenn das Einfügen aufgrund einer Ausnahme fehlschlägt, kann ich das im Ausnahmeblock behandeln. Gibt es Fälle, in denen die INSERT möglicherweise erfolgreich ausgeführt wird, aber keine Ausnahme auslösen, wo ich überprüfen muss, ob SQL%ROWCOUNT < 1?

+2

Ist Ihre INSERT-Anweisung eine Anweisung INSERT ... VALUES? Oder ein 'INSERT ... SELECT'? –

+1

Meine INSERT-Anweisung ist wie: EINFÜGEN ... WERTE – Sekhar

Antwort

15

überprüfen können, ob Ihre INSERT Aussage als INSERT ... VALUES strukturiert ist, dann Es wird entweder genau eine Zeile einfügen oder eine Ausnahme generieren. Es wäre nicht notwendig, die SQL%ROWCOUNT zu überprüfen.

Wenn Ihre INSERT Aussage als INSERT ... SELECT strukturiert ist, dann ist es möglich, dass die SELECT Anweisung 0 Zeilen zurück, die INSERT Anweisung 0 Zeilen einfügen wird und keine Ausnahme ausgelöst wird. Wenn Sie dies als einen Fehler betrachten, müssen Sie die SQL%ROWCOUNT überprüfen, nachdem die INSERT Anweisung ausgeführt wird.

+0

Ausgezeichnete Antwort! Ich habe mich immer gefragt, wie das passieren könnte. – Gili

2

Ja, um herauszufinden, wie viele Zeilen von DML-Anweisungen betroffen sind (INSERT, UPDATE usw.), können Sie den Wert von SQL%ROWCOUNT

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

if SQL%ROWCOUNT=0 then 
    RAISE_APPLICATION_ERROR(-20101, 'No records inserted'); 
end if;