DROP TABLE err_tab;
CREATE TABLE err_tab (
c_sqlcode NUMBER,
c_sqlerrm VARCHAR2(4000),
c_errpos VARCHAR2(100),
c_modulname VARCHAR2(4000),
c_user VARCHAR2(128),
c_time DATE,
c_comment VARCHAR2(4000),
c_vars CLOB
);
CREATE OR REPLACE PROCEDURE error_handling (
p_sqlcode IN NUMBER,
p_sqlerrm IN VARCHAR2,
p_errpos IN VARCHAR2,
p_user IN VARCHAR2,
p_time IN DATE DEFAULT sysdate,
p_comment IN VARCHAR2 DEFAULT '',
p_vars IN VARCHAR2,
p_mode IN VARCHAR2 DEFAULT 'T'
) IS
owner_name VARCHAR2(128);
caller_name VARCHAR2(128);
line_number NUMBER;
caller_type VARCHAR2(128);
PRAGMA autonomous_transaction;
BEGIN
owa_util.who_called_me(owner_name, caller_name, line_number, caller_type);
IF instr(p_mode, 'T') > 0 THEN -- Ausgabe in Tabelle
INSERT INTO err_tab (
c_sqlcode,
c_sqlerrm,
c_errpos,
c_modulname,
c_user,
c_time,
c_comment,
c_vars
) VALUES (
p_sqlcode,
p_sqlerrm,
p_errpos,
caller_type
|| ' '
|| caller_name,
p_user,
p_time,
p_comment,
p_vars
);
COMMIT;
ELSIF instr(p_mode, 'F') > 0 THEN -- Ausgabe in Datei
NULL; /* To be defined */
END IF;
END;
/
CREATE OR REPLACE PROCEDURE ptest IS
v_sqlcode NUMBER;
v_sqlerrm VARCHAR2(512);
v_errpos VARCHAR2( 512 );
i number;
begin
NULL; -- Hier könnte Ihr Code stehen
i:=1/0; EXCEPTION
WHEN OTHERS THEN
v_sqlcode:=sqlcode;
v_sqlerrm:=sqlerrm;
v_errpos:=DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
error_handling(v_sqlcode,v_sqlerrm,v_errpos,user,sysdate,null,'i=1/0','T');
END;
/
exec ptest
SELECT
*
FROM
err_tab;
Erklärung: Man kann sich eine eigene Fehlerbehandlungsroutine schreiben, die als Autonome Transaktion läuft. Damit beeinflusst sie nicht die aufrufende Procedure/Function.