DROP TABLE errlog;
CREATE TABLE errlog (
errcode INTEGER,
errmsg VARCHAR2(4000),
created_on DATE,
created_by VARCHAR2(100)
);
CREATE OR REPLACE PACKAGE err
IS
c_table CONSTANT PLS_INTEGER := 1; -- Default
c_file CONSTANT PLS_INTEGER := 2;
c_screen CONSTANT PLS_INTEGER := 3;
PROCEDURE handle (
errcode IN PLS_INTEGER := NULL,
errmsg IN VARCHAR2 := NULL,
logerr IN BOOLEAN := TRUE,
reraise IN BOOLEAN := FALSE
);
PROCEDURE report_and_stop (err_in IN INTEGER := SQLCODE,
msg_in IN VARCHAR2 := NULL);
PROCEDURE report_and_go (err_in IN INTEGER := SQLCODE,
msg_in IN VARCHAR2 := NULL);
PROCEDURE raise (
errcode IN PLS_INTEGER := NULL,
errmsg IN VARCHAR2 := NULL
);
PROCEDURE log (
errcode IN PLS_INTEGER := NULL,
errmsg IN VARCHAR2 := NULL
);
PROCEDURE logto (
target IN PLS_INTEGER,
dir IN VARCHAR2 := NULL,
file IN VARCHAR2 := NULL
);
FUNCTION logging_to
RETURN PLS_INTEGER;
END;
/
CREATE OR REPLACE PACKAGE BODY err
IS
g_target PLS_INTEGER := c_table;
g_file VARCHAR2 (2000) := 'err.log';
g_dir VARCHAR2 (2000) := NULL;
PROCEDURE handle (
errcode IN PLS_INTEGER := NULL,
errmsg IN VARCHAR2 := NULL,
logerr IN BOOLEAN := TRUE,
reraise IN BOOLEAN := FALSE
)
IS
BEGIN
IF logerr
THEN
log (errcode, errmsg);
END IF;
IF reraise
THEN
err.raise (errcode, errmsg);
END IF;
END;
PROCEDURE report_and_stop (err_in IN INTEGER := SQLCODE,
msg_in IN VARCHAR2 := NULL)
IS
BEGIN
handle (err_in, msg_in, TRUE, TRUE);
END report_and_stop;
PROCEDURE report_and_go (err_in IN INTEGER := SQLCODE,
msg_in IN VARCHAR2 := NULL)
IS
BEGIN
handle (err_in, msg_in, TRUE, FALSE);
END report_and_stop;
PROCEDURE raise (
errcode IN PLS_INTEGER := NULL,
errmsg IN VARCHAR2 := NULL
)
IS
l_errcode PLS_INTEGER := NVL (errcode, SQLCODE);
l_errmsg VARCHAR2(1000) := NVL (errmsg, SQLERRM);
BEGIN
IF l_errcode BETWEEN -20999 AND -20000
THEN
raise_application_error (l_errcode, l_errmsg);
/* Use positive error numbers -- lots to choose from! */
ELSIF l_errcode > 0
AND l_errcode NOT IN (1, 100)
THEN
raise_application_error (-20000, l_errcode || '-' || l_errmsg);
/* Can't EXCEPTION_INIT -1403 */
ELSIF l_errcode IN (100, -1403)
THEN
RAISE NO_DATA_FOUND;
/* Re-raise any other exception. */
ELSIF l_errcode != 0
THEN
EXECUTE IMMEDIATE
'DECLARE myexc EXCEPTION; ' ||
' PRAGMA EXCEPTION_INIT (myexc, ' ||
TO_CHAR (err_in) || ');' ||
'BEGIN RAISE myexc; END;';
END IF;
END;
PROCEDURE log (
errcode IN PLS_INTEGER := NULL,
errmsg IN VARCHAR2 := NULL
)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
l_sqlcode pls_integer := NVL (errcode, SQLCODE);
l_sqlerrm VARCHAR2(1000) := NVL (errmsg, SQLERRM);
BEGIN
IF g_target = c_table
THEN
INSERT INTO errlog
(errcode, errmsg, created_on, created_by)
VALUES (
l_sqlcode,
l_sqlerrm,
SYSDATE,
USER
);
ELSIF g_target = c_file
THEN
DECLARE
fid UTL_FILE.file_type;
BEGIN
fid := UTL_FILE.fopen (g_dir, g_file, 'A');
UTL_FILE.put_line (fid,
'Error log by ' || USER || ' at ' ||
TO_CHAR (SYSDATE, 'mm/dd/yyyy')
);
UTL_FILE.put_line (fid, NVL (errmsg, SQLERRM));
UTL_FILE.fclose (fid);
EXCEPTION
WHEN OTHERS
THEN
UTL_FILE.fclose (fid);
END;
ELSIF g_target = c_screen
THEN
DBMS_OUTPUT.put_line ('Error log by ' || USER || ' at ' ||
TO_CHAR (SYSDATE, 'mm/dd/yyyy')
);
DBMS_OUTPUT.put_line (NVL (errmsg, SQLERRM));
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
END;
PROCEDURE logto (
target IN PLS_INTEGER,
dir IN VARCHAR2 := NULL,
file IN VARCHAR2 := NULL
)
IS
BEGIN
g_target := target;
g_file := file;
g_dir := dir;
END;
FUNCTION logging_to
RETURN PLS_INTEGER
IS
BEGIN
RETURN g_target;
END;
END;
/