2017-05-18 2 views
0

Ich habe eine Prozedur, in TOAD, die einen neuen Datensatz nach Überprüfung des Datensatzes einfügen soll existiert nicht. Es schafft erfolgreich:Oracle PL/SQL-Prozedur führt nicht einfügen

CREATE OR REPLACE PROCEDURE Set_Mod ( 
    p_TypeID IN NUMBER, p_LinkID IN NUMBER 
    ) 
AS 
    v_isExists NUMBER := 0; 
    v_query varchar2(200); 
BEGIN 

    SELECT TypeID 
    INTO v_isExists 
    FROM myTable 
    WHERE LinkID = p_LinkID 
    AND TypeID = p_TypeID; 

    IF (v_isExists = 0) THEN 
     v_query := 'INSERT INTO myTable (TypeID, LinkID) VALUES (' || p_TypeID || ',' || p_LinkID || ')'; 

     EXECUTE IMMEDIATE v_query; 

    END IF; 

END; 

/

Ich versuche, das Verfahren mit diesem Block ausgeführt:

BEGIN 
     Set_Mod(1, 1); 

    END; 
/

ich diese Skript-Ausgänge in TOAD erhalten:

Procedure created. 
PL/SQL procedure successfully completed. 

, aber keine alle Einfügungen. Es funktioniert nicht. Irgendwelche Ideen wo ist das Problem?

+0

Es sieht Lüge Ihr Ziel ist, herauszufinden, ob ein Datensatz bereits existiert, dann fügen Sie eine Zeile nur ein, wenn eine nicht existiert. Lesen Sie die folgende Antwort, um zu beheben, was falsch ist, aber ziehen Sie auch einen UNIQUE-Kombinationsschlüssel-Index für die beiden Spalten in Betracht, damit Sie niemals zwei Zeilen mit den gleichen TypeID-Werten für die Verknüpfungs-ID eingeben können. - Dann können Sie die Duplizierungsausnahme abfangen und vielleicht eine Aktualisierung anstelle einer Einfügung vornehmen? – JasonInVegas

Antwort

1

So ist die Logik in der proc ist (Art) Ton, aber Ihre Testlogik ist nicht:

Wenn Sie Set_Mod (1,1) rufen die Antworten werden entweder v_isExists = 1, wenn die Abfrage eine Zeile zurückgibt oder die PL/SQL-Ausnahme NO_DATA_FOUND, wenn keine Zeile zurückgegeben wird.

Da Sie diese Ausnahme nicht abfangen, wird das Verfahren abgeschlossen, aber kein Einfügen geschieht ... v_isExists = 0 wird nicht wahr sein, außer ich nehme an, wenn Sie Set_Mod (0,0) aufrufen.

Überprüfen Sie bitte this documentation auf Umgang mit PL/SQL-Ausnahmen in Prozeduren und suchen Sie SO für PL/SQL-Ausnahmebehandlung für weitere Details.

+1

Ich würde auch vorschlagen, dass Sie nicht das Ausführen sofort verwenden, sondern setzen Sie die Insert-Anweisung in die Ausnahmebehandler und machen Sie alles transaktional. – JasonInVegas

+0

Ich muss entweder Ihre Lösung verwenden oder meine Abfrage ändern, um count (*) auszuwählen, und es funktioniert. Tatsächlich werde ich in diesem Fall niemals einer doppelten Einführungssituation gegenüberstehen. Vielen Dank – Al007