PL/SQLで、変数に格納した値が出力できない
いつもお世話になっております。
現在PL/SQLでコーディングを行っているのですが
テーブルA あ い う
テーブルB い え
テーブルC う お
となっていて、
Aの「い」がBの「い」と一致するものがあれば「え」を出力
Aの「う」がCの「う」と一致するものがあれば「お」を出力
します。最終的に
テーブルD あ え お
としたいです。
しかしテーブルAでカーソルに設定したものは出るのですが、
それ以外の変数に入れたものが出力されません。
どうしてなのか、また、どうしたらよいか
お分かりなる方がいらっしゃいましたら
教えていただけないでしょうか?
CREATE OR REPLACE PROCEDURE SYORI1
IS
v_cust_id number(10);
v_unit_sec number(10);
v_price number(10);
v_err_no varchar2(3);
v_err_msg varchar2(30);
/*カーソルの宣言*/
CURSOR c_cur
IS
SELECT answr_time,
disc_time,
calling_num,
area_id,
FROM call_data
WHERE bill = '1'
AND direction = 'O';
BEGIN
FOR c_rec IN c_cur LOOP
/*エラーのリセット*/
v_err_no:= '00';
v_err_msg:= 'エラーなし';
/*事業者テーブルからデータを探す*/
BEGIN
SELECT
cust_id,
unit_sec
INTO
v_cust_id,
v_unit_sec
FROM
m_cust
WHERE
orig_opn_dgt = c_rec.calling_num
AND
voi_dat_cls = c_rec.isdn_mode;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
v_err_no := '91';
v_err_msg := '該当する業者が複数見つかりました';
WHEN NO_DATA_FOUND THEN
null;
END;
/*料金テーブルからデータを探す*/
BEGIN
SELECT
price
INTO
v_price
FROM
m_price
WHERE
cust_id = v_cust_id
AND
area_id = c_rec.area_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_err_no := '12';
v_err_msg := 'ユニット料金取得エラー';
END;
INSERT INTO BILL_DATA(
ans_tm,
disc_tm,
cust_id,
area_id,
voi_dat_cls,
unit_sec,
err_no,
err_msg)
VALUES (
c_rec.answr_time,
c_rec.disc_time,
v_cust_id,(★)
c_rec.area_id,
c_rec.isdn_mode,
v_unit_sec,(★)
v_err_no,(★)
v_err_msg(★));
END LOOP;
END SYORI1;
/
となっていて、実行するとPL/SQLプロシージャが正常に完了しました
と出ます。しかし(★)の項目は値が入っていません。
それ以外の項目は問題なく出力されました。
カーソルの出力では変数は使えないのでしょうか?
初心者なので全く新しい方法は難しいので
上記のコードに何か付け加えて上手くいけばと考えています。
よろしくお願いいたします。
長くなってしまい申し訳ありません。
お礼
インデントを付けて見てみました。 ありがとうございます。 >ファンクションだけをBEGIN~EXCEPTION~END;のブロックで囲んで >捕捉したい例外(NO_DATA_FOUND)だけをEXCEPTIONで書けば >NO_DATA_FOUNDがこの関数内で起きてもそれ以降の処理は >継続され、NO_DATA_FOUND以外なら処理終了します。 プログラム⇒プロシージャ⇒ファンクションという流れになっているのですが、ファンクションでNO_DATA_FOUND以外の例外が発生した場合、プロシージャのEXCEPTION WHEN OTHERS THENブロックにくるということですね。 プロシージャからプログラムへ結果を返さないといけないのですが、プロシージャのEXCEPTION WHEN OTHERS THENで戻り値に異常終了を代入しておけば、ファンクションでWHEN OTHERS THENが発生した場合も異常終了で返されるということですね。 ありがとうございました。