- ベストアンサー
PL/SQLで変数に格納した値が出力できない
- テーブルAの「い」とテーブルBの「い」が一致する場合に「え」を出力し、テーブルAの「う」とテーブルCの「う」が一致する場合に「お」を出力する処理のPL/SQLコードを作成しています。テーブルAでカーソルに設定した値は出力されるのですが、その他の変数に入れた値が出力されない問題があります。カーソルの出力では変数は使用できないのでしょうか?解決方法を教えてください。
- PL/SQLでコーディングを行っていて、テーブルAの「い」とテーブルBの「い」が一致する場合に「え」を出力し、テーブルAの「う」とテーブルCの「う」が一致する場合に「お」を出力する処理を実装しています。しかし、テーブルAでカーソルに設定した値は出力されるのに対し、その他の変数に入れた値が出力されないという問題が発生しています。カーソルの出力では変数を使用することはできないのでしょうか?解決策を教えてください。
- PL/SQLでテーブルAの「い」とテーブルBの「い」が一致する場合に「え」を出力し、テーブルAの「う」とテーブルCの「う」が一致する場合に「お」を出力する処理を書いていますが、テーブルAでカーソルに設定した値は出力されるのに、その他の変数に入れた値が出力されません。カーソルの出力では変数は使えないのでしょうか?解決方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 >本当は、いくつかのプロシージャに分けるらしいのですが、そのやり方がわからず、教えてもらえないので無理やり1つのプロシージャでやっている状態です。 おつかれさまです。が、実は逆の意味で書いたのです。 PL/SQLでカーソルを回して1件ずつ処理する必要があるのかなぁと思ったので(例えば以下のINSERT SELECT文を一回実行すれば済むような) INSERT INTO BILL_DATA( ans_tm, disc_tm, cust_id, area_id, voi_dat_cls, unit_sec, err_no, err_msg) SELECT d.answr_time, d.disc_time, CASE WHEN c.cust_cnt=1 THEN c.cust_id END, CASE WHEN c.cust_cnt=1 THEN d.area_id END, d.isdn_mode, c.unit_sec, CASE WHEN c.cust_cnt<>1 THEN '92' WHEN p.price IS NULL THEN '12' END, CASE WHEN NVL(c.cust_cnt,0)<>1 THEN '該当する業者が複数見つかりました'' WHEN p.price IS NULL THEN 'ユニット料金取得エラー' END FROM call_data d LEFT OUTER JOIN (SELECT orig_opn_dgt,voi_dat_cls,MAX(cust_id) cust_id,MAX(unit_sec) unit_sec,COUNT(*) cust_cnt FROM m_cust GROUP BY orig_opn_dgt,voi_dat_cls) c ON c.orig_opn_dgt=d.rec_calling_num AND c.voi_dat_cls=d.isdn_mode LEFT OUTER JOIN m_price p ON p.cust_id=c.cust_id AND p.area_id=d.area_id WHERE d.bill='1' AND d.direction='O' ・・・まあ、余談です。
その他の回答 (1)
- jamshid6
- ベストアンサー率88% (591/669)
該当する業者が見つからない場合、v_cust_id, v_unit_secには値が入らないですし、見つからなくても何もしないことになっているので、v_err_no, v_err_msgにも何もセットされません。 変数以外の部分はすべてカーソルなので、検索結果に関係なく値が入るのは当然です。 結局、業者がヒットするものが一件もなかったということでしょう。どういうデータかはわかりませんが、業者を検索するところの条件が本当に正しいかチェックしてみてはどうですか? #この処理、本当にPL/SQLでやるんですか?
補足
テストデータを変えて、エラーが出るようになりました。 ありがとうございます。 >#この処理、本当にPL/SQLでやるんですか? やるんです(涙) 本当は、いくつかのプロシージャに分けるらしいのですが、 そのやり方がわからず、教えてもらえないので 無理やり1つのプロシージャでやっている状態です。
お礼
教えていただいたINSERT文、できました! こんな簡単にできるんですね。 恐らく今回の課題の趣旨が、問題を解くこと以上に PL/SQLの使い方を理解することにあるみたいです。 せっかく教えていただいたのに使えなくて残念です。 めげずに、プロシージャを複数にするのに 取り組んでみたいと思います。 ありがとうございました。