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
Sie Ausnahmeblock für die Funktion im Falle einer Ausnahme hinzufügen können Sie sonst 0 1. – ypp
in Ausnahme zurückkehren zurückkehren Ich kann ein ELSE verwenden? Zum Beispiel: 'WENN andere dann 0 zurückgeben; ELSE return 1; ' – Mahmoud
@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