2016-03-24 19 views
0

In meiner Funktion ausgeführt wird, ich habe eine INSERT durch eine Select ..Wie wissen, ob die Abfrage erfolgreich in PLSQL

CREATE OR REPLACE FUNCTION INSERT_DATA 
RETURN VARCHAR2 
AS 
BEGIN 
INSERT INTO T_ITEMS (cd_1,cd_2,cd_3) 
    (SELECT cd_1,cd_2,cd_3 FROM REC_ITEMS); 
COMMIT; 
RETURN 'Return 1 if All is OK else return 0'; 
END; 

Wie kann ich wissen, dass meine INSERT bestanden hat und alle Leitungen sind erfolgreich aufgezeichnet?

Mein fontion sollte 1 zurück, wenn alles in Ordnung ist ansonsten Rückgabe von 0.

+0

Sie Ausnahmeblock für die Funktion im Falle einer Ausnahme hinzufügen können Sie sonst 0 1. – ypp

+0

in Ausnahme zurückkehren zurückkehren Ich kann ein ELSE verwenden? Zum Beispiel: 'WENN andere dann 0 zurückgeben; ELSE return 1; ' – Mahmoud

+1

@Mahmoud Was meinen Sie mit" alle Zeilen werden erfolgreich aufgezeichnet "? Wenn eine Prozedur/Funktion ausgeführt wird, ohne eine Ausnahme zurückzugeben (vorausgesetzt, sie haben keinen Ausnahme-Block "wenn andere als null sind!"), Bedeutet dies, dass sie erfolgreich war. Normalerweise müssen Sie eine Prüfung nicht codieren, um festzustellen, ob es erfolgreich war oder nicht, da Sie in Fällen, in denen ein Problem aufgetreten ist, eine Ausnahme auslösen können. – Boneist

Antwort

3

Wenn ich Sie wäre, würde ich nicht als Funktion kodieren diese, ich es als ein Verfahren tun würde, etwa so:

create or replace procedure insert_data 
as 
begin 
    insert into t_items (cd_1, cd_2, cd_3) 
    select cd_1, cd_2, cd_3 
    from rec_items; 

    commit; 
end; 
/

Wenn ich wissen musste, wie viele Zeilen eingefügt wurden, würde ich wie so ein out-Parameter hinzu:

create or replace procedure insert_data (p_num_rows_inserted out number) 
as 
begin 
    insert into t_items (cd_1, cd_2, cd_3) 
    select cd_1, cd_2, cd_3 
    from rec_items; 

    p_num_rows_inserted := sql%rowcount; 

    commit; 
end; 
/

die Transaktion um sicherzustellen, wird ein Rollback, nachdem das Verfahren abgeschlossen ist, Sie könnte hinzufügen eine Ausnahmeklausel zum Hinzufügen eines Rollbacks.

Hier ist ein Beispiel, das wie es zeigt, könnte funktionieren:

create table t1 (col1 number, col2 number, col3 number, constraint t1_uq unique (col1, col2) using index); 

begin 
    insert into t1 (col1, col2, col3) 
    select 1, 1, 1 from dual union all 
    select 1, 2, 3 from dual; 

    commit; 

exception 
    when dup_val_on_index then 
    rollback; 
    raise; 
end; 
/

PL/SQL procedure successfully completed. 

begin 
    insert into t1 (col1, col2, col3) 
    select 2, 2, 1 from dual union all 
    select 2, 2, 3 from dual; 

    commit; 

exception 
    when dup_val_on_index then 
    rollback; 
    raise; 
end; 
/

Error at line 10 
ORA-00001: unique constraint (SCHEMA.T1_UQ) violated 
ORA-06512: at line 11 

N. B. Ich habe die COMMIT/ROLLBACKs im obigen Beispielcode verlassen, aber wie Alex in den Kommentaren unten sagt, würden Sie normalerweise die Transaktionsverarbeitung für die aufrufende Prozedur belassen.


Ich würde empfehlen Sie Ausnahmebehandlung lesen in PL/SQL: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm#LNPLS00701

+0

zum ersten Mal dachte ich darüber nach. aber das ist nicht was ich will, es ist notwendig, falls eine Zeile sich nicht einfügt, muss ich eine 0 zurückgeben und die Transaktion abbrechen. – Mahmoud

+1

@Mahmoud Warum müssen Sie eine 0 zurückgeben? Gib einfach den Fehler zurück, der ausgelöst wurde. – Boneist

+5

Ich würde im Allgemeinen vermeiden Commit oder Rollback in der Prozedur und lassen Sie den Anrufer entscheiden, was zu tun ist - dies kann als Teil einer größeren Transaktion aufgerufen werden, und dies könnte zu Verwirrung/Korruption führen. Und der Anrufer muss wissen, dass es ein Problem gab, da das OP im Moment versucht, eine Flagge zurückzugeben.(Dies ist für den OP von Vorteil; ich weiß, dass die Frage das Commit in der Funktion bereits hatte, und was Sie gezeigt haben, erweitert das) –

Verwandte Themen