2012-03-27 4 views
1

ich ein paar SQL (Select/Update/Insert) Syntax, die ich in PL/SQL einer nach dem anderenPL/SQL überprüfen SQL-Ausgabe, wenn es OK ging oder nicht?

ist es eine Möglichkeit zu überprüfen, ob jeder Syntax korrekt abgeschlossen laufen wird und wenn es einige Fehler wird es nicht Halte das ganze PL/SQL an, es wird nur "OK" oder "Nicht OK" an eine Variable zurückgeben, damit ich es mit IF benutzen kann?

UPDATE

ich mit dieser Funktion kam, aber es Dosis scheint nicht zu funktionieren, es 0 gibt alle Zeit!

create or replace 
FUNCTION EXECUTE_SQL(
     V_SQL IN VARCHAR2) 
    RETURN NUMBER 
    AS 
    V_RESULTS NUMBER := 1; 
    BEGIN 
    BEGIN 
     EXECUTE IMMEDIATE V_SQL; 
    EXCEPTION 
    WHEN OTHERS THEN 
     -- the following line is just for debugging! 
     dbms_output.put_line(SQLERRM); 
     V_RESULTS:= 0; 
    END; 
    RETURN V_RESULTS; 
    END EXECUTE_SQL; 

was ist falsch wit it (falls vorhanden)! Prost

+1

Was übertragen Sie an die Funktion in v_sql? Und was druckt dbms_output.put_line? –

+3

Warnung: "WENN ANDERE DANN" ohne "RAISE" Tom Kyte zum Weinen bringt. –

+0

@ René v_sql kann jede SQL-Syntax sein! und dbms_output.put_line (SQLERRM); ist nur zu sehen, ob die Funktion woks! Ich werde es löschen, sobald die Funktion funktioniert, das war's! –

Antwort

4
if sql%rowcount > 0 then 
    -- insert or update statement affected sql%rowcount rows 
end if; 

Wie für die korrekte Syntax: Wenn die Syntax falsch ist, wird es nicht einmal kompilieren. Wenn ein Datenkonsistenzfehler vorliegt (z. B. Division durch Fehler 0 oder Primärschlüsselverletzung), wird eine Ausnahme ausgelöst. Eine solche Ausnahme kann in exception handlers

Im Exception-Handler abgefangen werden, können Sie dann sqlerrm um weitere Informationen überprüfen:

begin 
    update t set x = ... 
exception when others then 
    dbms_output.put_line(SQLERRM); 
end; 

Es gibt auch ein paar predefined exceptions, dass Sie überprüfen können:

begin 
      update t set x = ... 
exception 
    when DUP_VAL_ON_INDEX 
     -- primary key or unique key violation 
    when OTHERS 
     -- other kind of exception 
    end; 
+0

danke, habe ich meine Frage auf der Grundlage Ihrer Antwort aktualisiert, hoffe, Sie können mir helfen, Prost –

+1

"Wenn die Syntax falsch ist, wird es nicht einmal kompilieren" Die SQL wird ausgeführt von execute sofort, so dass es nicht überprüft wird zur Kompilierzeit. Es ist völlig möglich, ungültige SQL an die Funktion zu übergeben. –

+0

@Burhan Ali: Zu der Zeit, als ich dies geschrieben habe, wurde die Frage nicht bearbeitet und es gab keine Erwähnung von 'execute sofort', und die * Syntax * bezog sich auf jede 'gewöhnliche' SQL-Anweisung, die nicht 'execute' ausgeführt wurde '. Also, zu dieser Zeit war die Bemerkung vollkommen richtig. –

2

Wenn die Syntax nicht korrekt ist, ist der gesamte Block ungültig, so dass Sie ihn nicht ausführen können.

Wenn Sie alle Anweisungen ausgeführt werden soll, trotz dass man eine Ausnahme auslösen, können Sie:

BEGIN 

    BEGIN 
    statement1; 
    EXCEPTION 
    when exception1 then 
     some commands or null; 
    when exception2 then 
     some commands or null; 
    END; 

    BEGIN 
    statement2; 
    EXCEPTION 
    when exception3 then 
     some commands or null; 
    when exception4 then 
     some commands or null; 
    END; 

    etc. 
END; 
+0

das war nette Antwort, um die Dinge einfacher zu machen, habe ich eine Funktion, so dass ich es oft anrufen kann!. Bitte schau dir meine aktualisierte Frage an!Prost –

0

schreiben show errors

begin 
      update t set x = ... 
exception 
    when DUP_VAL_ON_INDEX 
     -- primary key or unique key violation 
    when OTHERS 
     -- other kind of exception 
    end; 
/
show errors 

Es werden Fehler angezeigt, falls vorhanden.

+0

Danke, bitte sehen Sie sich meine aktualisierte Frage an! Prost –