CREATE OR REPLACE PACKAGE expt_sample
IS
PROCEDURE main(iv_dept IN VARCHAR2);
END;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
-- salを100倍して、オーバーフローが発生するSQL
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- INSERT文を発行するプロシージャ
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
BEGIN
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
RAISE;
END ins;
--
-- カーソルでデータを取得するプロシージャ
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
RAISE;
END sel;
--
-- mainプロシージャ
PROCEDURE main(iv_dept IN VARCHAR2)
IS
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE expt_sample
IS
PROCEDURE main(iv_dept IN VARCHAR2);
END;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
-- salを100倍して、オーバーフローが発生するSQL
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- INSERT文を発行するプロシージャ
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
BEGIN
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
RAISE;
END ins;
--
-- カーソルでデータを取得するプロシージャ
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
RAISE;
END sel;
--
-- mainプロシージャ
PROCEDURE main(iv_dept IN VARCHAR2)
IS
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample'; -- パッケージ名を定義(固定値)
-- salを100倍して、オーバーフローが発生するSQL
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- INSERT文を発行するプロシージャ
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
cv_prog_name CONSTANT VARCHAR2(30) := 'ins'; -- プロシージャ名を定義(固定値)
BEGIN
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
RAISE;
END ins;
--
-- カーソルでデータを取得するプロシージャ
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
cv_prog_name CONSTANT VARCHAR2(30) := 'sel'; -- プロシージャ名を定義(固定値)
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
RAISE;
END sel;
--
-- mainプロシージャ
PROCEDURE main(iv_dept IN VARCHAR2)
IS
cv_prog_name CONSTANT VARCHAR2(30) := 'main'; -- プロシージャ名を定義(固定値)
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample'; -- パッケージ名を定義(固定値)
-- salを100倍して、オーバーフローが発生するSQL
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- INSERT文を発行するプロシージャ
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
cv_prog_name CONSTANT VARCHAR2(30) := 'ins'; -- プロシージャ名を定義(固定値)
BEGIN
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
RAISE;
END ins;
--
-- カーソルでデータを取得するプロシージャ
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
cv_prog_name CONSTANT VARCHAR2(30) := 'sel'; -- プロシージャ名を定義(固定値)
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
RAISE;
END sel;
--
-- mainプロシージャ
PROCEDURE main(iv_dept IN VARCHAR2)
IS
cv_prog_name CONSTANT VARCHAR2(30) := 'main'; -- プロシージャ名を定義(固定値)
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
-- cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample';
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- 例外処理の共通プロシージャ
PROCEDURE common_err(err_dpth IN PLS_INTEGER, bt_dpth IN PLS_INTEGER, subprg_unit IN VARCHAR2)
IS
ln_errdpt PLS_INTEGER := 0;
BEGIN
dbms_output.put_line(
RPAD(subprg_unit, 30)
|| RPAD(TO_CHAR(utl_call_stack.backtrace_line(bt_dpth), '99'), 8)
|| RPAD(utl_call_stack.error_number(err_dpth), 6)
|| utl_call_stack.error_msg(err_dpth)
);
END common_err;
--
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'ins';
BEGIN
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
WHEN OTHERS THEN
-- dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
dbms_output.put_line('SUBPROGRAM/BT_LINE/ERR_NUM/ERR_MSG');
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END ins;
--
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
-- cv_prog_name CONSTANT VARCHAR2(30) := 'sel';
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END sel;
--
PROCEDURE main(iv_dept IN VARCHAR2)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'main';
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
-- cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample';
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- 例外処理の共通プロシージャ
PROCEDURE common_err(err_dpth IN PLS_INTEGER, bt_dpth IN PLS_INTEGER, subprg_unit IN VARCHAR2)
IS
ln_errdpt PLS_INTEGER := 0;
BEGIN
dbms_output.put_line(
RPAD(subprg_unit, 30)
|| RPAD(TO_CHAR(utl_call_stack.backtrace_line(bt_dpth), '99'), 8)
|| RPAD(utl_call_stack.error_number(err_dpth), 6)
|| utl_call_stack.error_msg(err_dpth)
);
END common_err;
--
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'ins';
BEGIN
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
WHEN OTHERS THEN
-- dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
dbms_output.put_line('SUBPROGRAM/BT_LINE/ERR_NUM/ERR_MSG');
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END ins;
--
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
-- cv_prog_name CONSTANT VARCHAR2(30) := 'sel';
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END sel;
--
PROCEDURE main(iv_dept IN VARCHAR2)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'main';
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
-- cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample';
expt_sal_over_range EXCEPTION; --例外の定義
--
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- 例外処理の共通プロシージャ
PROCEDURE common_err(err_dpth IN PLS_INTEGER, bt_dpth IN PLS_INTEGER, subprg_unit IN VARCHAR2)
IS
ln_errdpt PLS_INTEGER := 0;
BEGIN
dbms_output.put_line(
RPAD(subprg_unit, 30)
|| RPAD(TO_CHAR(utl_call_stack.backtrace_line(bt_dpth), '99'), 8)
|| RPAD(utl_call_stack.error_number(err_dpth), 6)
|| utl_call_stack.error_msg(err_dpth)
);
END common_err;
--
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'ins';
BEGIN
-- salの値チェック
IF ir_emp.sal > 1000 THEN
RAISE expt_sal_over_range;
END IF;
--
-- 問題が無ければINSERT
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
-- salの金額チェックエラー。文言出力して処理継続
WHEN expt_sal_over_range THEN
dbms_output.put_line('SAL value over limited value(' || ir_emp.empno || ' / ' || ir_emp.sal || ')');
WHEN OTHERS THEN
-- dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
dbms_output.put_line('SUBPROGRAM/BT_LINE/ERR_NUM/ERR_MSG');
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END ins;
--
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
-- cv_prog_name CONSTANT VARCHAR2(30) := 'sel';
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END sel;
--
PROCEDURE main(iv_dept IN VARCHAR2)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'main';
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
-- cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample';
expt_sal_over_range EXCEPTION; --例外の定義
--
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- 例外処理の共通プロシージャ
PROCEDURE common_err(err_dpth IN PLS_INTEGER, bt_dpth IN PLS_INTEGER, subprg_unit IN VARCHAR2)
IS
ln_errdpt PLS_INTEGER := 0;
BEGIN
dbms_output.put_line(
RPAD(subprg_unit, 30)
|| RPAD(TO_CHAR(utl_call_stack.backtrace_line(bt_dpth), '99'), 8)
|| RPAD(utl_call_stack.error_number(err_dpth), 6)
|| utl_call_stack.error_msg(err_dpth)
);
END common_err;
--
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'ins';
BEGIN
-- salの値チェック
IF ir_emp.sal > 1000 THEN
RAISE expt_sal_over_range;
END IF;
--
-- 問題が無ければINSERT
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
-- salの金額チェックエラー。文言出力して処理継続
WHEN expt_sal_over_range THEN
dbms_output.put_line('SAL value over limited value(' || ir_emp.empno || ' / ' || ir_emp.sal || ')');
WHEN OTHERS THEN
-- dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
dbms_output.put_line('SUBPROGRAM/BT_LINE/ERR_NUM/ERR_MSG');
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END ins;
--
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
-- cv_prog_name CONSTANT VARCHAR2(30) := 'sel';
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END sel;
--
PROCEDURE main(iv_dept IN VARCHAR2)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'main';
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END main;
END expt_sample;
/
次のような警告メッセージが出力されます。
SAL value over limited value(7566 / 297500)
SAL value over limited value(7788 / 300000)
SAL value over limited value(7902 / 300000)
SAL value over limited value(7369 / 80000)
SAL value over limited value(7876 / 110000)
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
-- cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample';
expt_sal_over_range EXCEPTION; --例外の定義
--
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- 例外処理の共通プロシージャ
PROCEDURE common_err(err_dpth IN PLS_INTEGER, bt_dpth IN PLS_INTEGER, subprg_unit IN VARCHAR2)
IS
ln_errdpt PLS_INTEGER := 0;
BEGIN
dbms_output.put_line(
RPAD(subprg_unit, 30)
|| RPAD(TO_CHAR(utl_call_stack.backtrace_line(bt_dpth), '99'), 8)
|| RPAD(utl_call_stack.error_number(err_dpth), 6)
|| utl_call_stack.error_msg(err_dpth)
);
END common_err;
--
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'ins';
BEGIN
-- salの値チェック
IF ir_emp.sal > 1000 THEN
RAISE expt_sal_over_range;
END IF;
--
-- 問題が無ければINSERT
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
-- salの金額チェックエラー。文言出力して処理継続
WHEN expt_sal_over_range THEN
dbms_output.put_line('SAL value over limited value(' || ir_emp.empno || ' / ' || ir_emp.sal || ')');
RAISE;
WHEN OTHERS THEN
-- dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
dbms_output.put_line('SUBPROGRAM/BT_LINE/ERR_NUM/ERR_MSG');
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END ins;
--
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
-- cv_prog_name CONSTANT VARCHAR2(30) := 'sel';
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END sel;
--
PROCEDURE main(iv_dept IN VARCHAR2)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'main';
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END main;
END expt_sample;
/
CREATE OR REPLACE PACKAGE BODY expt_sample
IS
-- cv_package_name CONSTANT VARCHAR2(30) := 'expt_sample';
expt_sal_over_range EXCEPTION; --例外の定義
--
CURSOR c_emp(iv_dept IN VARCHAR2)
IS
SELECT e.empno, e.ename, e.deptno, d.dname, e.sal*100 AS sal, e.comm
FROM emp e INNER JOIN dept d ON (e.deptno = d.deptno)
WHERE e.deptno = iv_dept;
--
-- 例外処理の共通プロシージャ
PROCEDURE common_err(err_dpth IN PLS_INTEGER, bt_dpth IN PLS_INTEGER, subprg_unit IN VARCHAR2)
IS
ln_errdpt PLS_INTEGER := 0;
BEGIN
dbms_output.put_line(
RPAD(subprg_unit, 30)
|| RPAD(TO_CHAR(utl_call_stack.backtrace_line(bt_dpth), '99'), 8)
|| RPAD(utl_call_stack.error_number(err_dpth), 6)
|| utl_call_stack.error_msg(err_dpth)
);
END common_err;
--
PROCEDURE ins(ir_emp IN c_emp%ROWTYPE)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'ins';
BEGIN
-- salの値チェック
IF ir_emp.sal > 1000 THEN
RAISE expt_sal_over_range;
END IF;
--
-- 問題が無ければINSERT
INSERT INTO emp_sample
VALUES(ir_emp.empno, ir_emp.ename, ir_emp.deptno, ir_emp.dname, ir_emp.sal, ir_emp.comm);
EXCEPTION
-- salの金額チェックエラー。文言出力して処理継続
WHEN expt_sal_over_range THEN
dbms_output.put_line('SAL value over limited value(' || ir_emp.empno || ' / ' || ir_emp.sal || ')');
RAISE;
WHEN OTHERS THEN
-- dbms_output.put_line(cv_package_name || '.' || cv_prog_name || ':' || SQLERRM);
dbms_output.put_line('SUBPROGRAM/BT_LINE/ERR_NUM/ERR_MSG');
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END ins;
--
PROCEDURE sel(iv_dept IN VARCHAR2)
IS
r_emp c_emp%ROWTYPE;
-- cv_prog_name CONSTANT VARCHAR2(30) := 'sel';
BEGIN
FOR r_emp IN c_emp(iv_dept)
LOOP
ins(r_emp);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END sel;
--
PROCEDURE main(iv_dept IN VARCHAR2)
IS
-- cv_prog_name CONSTANT VARCHAR2(30) := 'main';
BEGIN
sel(iv_dept);
EXCEPTION
WHEN OTHERS THEN
common_err(utl_call_stack.error_depth, utl_call_stack.backtrace_depth,
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(utl_call_stack.error_depth)));
RAISE;
END main;
END expt_sample;
/
実行すると、次のように出力されます。
SAL value over limited value(7566 / 297500)
EXPT_SAMPLE.SEL 41 6510 PL/SQL: ユーザー定義の例外が発生しましたが、処理されませんでした
EXPT_SAMPLE.MAIN 63 6510 PL/SQL: ユーザー定義の例外が発生しましたが、処理されませんでした
プロシージャselとmainの例外処理ではSQLERRMを出力しているため、
今回定義した「expt_sal_over_range」に該当するメッセージが存在
しないため、上記のような出力結果となります。
最近のコメント