2016-03-23 8 views
1

Das ist, was ich bisher habe. Wenn ich gültige Daten eingib und es ausführe, wird die Tabelle korrekt aktualisiert. Wenn ich es unter Verwendung von Autorennummern ausführe, von denen ich weiß, dass sie in der Tabelle nicht existieren, wird sie trotzdem ausgeführt und gibt die Ausnahmeanweisungen nicht aus. Weiß jemand, warum meine Ausnahmen nicht funktionieren? Jede Hilfe wäre dankbar, danke!Sqlplus mit gespeicherten Prozeduren, um eine Zeile zu aktualisieren

CREATE OR REPLACE PROCEDURE update_authorname 
(selected_author_num IN NUMBER, 
new_author_first IN CHAR, 
new_author_last IN CHAR) AS 

BEGIN 
UPDATE author 
SET author_first = new_author_first, author_last = new_author_last 
WHERE author_num = selected_author_num; 

EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN 
    DBMS_OUTPUT.PUT_LINE('No author with this number exists: ' || selected_author_num); 

    WHEN ROWTYPE_MISMATCH 
    THEN 
    DBMS_OUTPUT.PUT_LINE('Error: There was a row type mismatch when updating'); 

END; 
/

Dies ist, was ich die Prozedur aufzurufen verwendet: wird

BEGIN 
update_authorname(6,'Emma','White'); 
END; 
/

Antwort

0

Eine update Anweisung keine Ausnahme werfen, wenn die where Klausel nicht abgestimmt, es still gerade ausfällt. Stattdessen müssen Sie entweder überprüfen:

  1. Die Reihe exists vor dem Update geändert etwas zu aktualisieren oder
  2. versuchen.

1. Die Reihe besteht

CREATE OR REPLACE PROCEDURE update_authorname 
(selected_author_num IN NUMBER, 
new_author_first IN CHAR, 
new_author_last IN CHAR) AS 

BEGIN 

IF NOT EXISTS (SELECT 1 FROM author WHERE author_num = selected_author_num; 
    DBMS_OUTPUT.PUT_LINE('No author with this number exists: ' || selected_author_num); 
ELSE 
    UPDATE author 
    SET author_first = new_author_first, author_last = new_author_last 
    WHERE author_num = selected_author_num; 

EXCEPTION 
    WHEN ROWTYPE_MISMATCH 
    THEN 
    DBMS_OUTPUT.PUT_LINE('Error: There was a row type mismatch when updating'); 

END; 
/

2. Das Update Änderungen vorgenommen

CREATE OR REPLACE PROCEDURE update_authorname 
(selected_author_num IN NUMBER, 
new_author_first IN CHAR, 
new_author_last IN CHAR) AS 

BEGIN 


UPDATE author 
SET author_first = new_author_first, author_last = new_author_last 
WHERE author_num = selected_author_num; 

IF @@ROWCOUNT <= 0 
    DBMS_OUTPUT.PUT_LINE('No author with this number exists: ' || selected_author_num); 

EXCEPTION 
    WHEN ROWTYPE_MISMATCH 
    THEN 
    DBMS_OUTPUT.PUT_LINE('Error: There was a row type mismatch when updating'); 

END; 
/

Es gibt sicherlich andere Möglichkeiten, um das gleiche Ergebnis zu erzielen, aber diese sind die zwei am häufigsten.

+0

Vielen Dank! Es funktioniert jetzt. – Jessica