• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PL/SQLにて、マスタから取得した値をORDER BY句に指定したい)

PL/SQLでマスタから取得した値をORDER BY句に指定する方法

このQ&Aのポイント
  • PL/SQLにて、マスタから取得した値をORDER BY句に指定したいです。具体的には、「ソートマスタ」から値を取得し、「トラン」テーブルの検索結果をソートしたいです。
  • しかし、現在の方法では、ORDER BY句が効かない状態です。何か他の方法があれば教えてください。
  • ご存知の方、お手数ですがアドバイスいただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

PL/SQL内でカーソルを使った読み出しで、ORDER指定を動的に変更したい。 ということでしょ? 静的なカーソル定義では出来ません。 ORDERに、項目を指す変数を指定できません。 動的SQL機能を利用してください。 詳しくはマニュアルをご覧ください。 イメージとしては、こんな感じ。 DECLARE type CurTyp is ref cursor; CURx CurTyp; SQL1 varchar2(1000); CURSOR CUR1 IS SELECT SORT_ITEM,SORT_SBT FROM SORT_MST ORDER BY SORT_ORDER; BEGIN SQL1:='SELECT SORT_ITEM,SORT_SBT FROM SORT_MST ORDER BY '; for CUR1_REC in CUR1 loop SQL1:=SQL1||CUR1_REC.SORT_ITEM||' '||CUR1_REC.SORT_SBT||','; end loop; SQL1:=SQL1||'1'; open CURx for SQL1; for CURx_REC in CURx loop; dbms_output.put_line(CURx.ITM_SBT||CURx.ITEM_COD||CURx.ITEM_NM||CURx.ITM_AMN); end loop; close CURx; END; 動くつもりで書いたけど、テストしてない。 (エラー処理を端折っているので、ご注意ください)

myu55
質問者

お礼

k_o_r_o_c_h_a_nさん、ご教示ありがとうございます。 ちょっと直して実行したところ、うまくいきました。 本当に助かりました!ありがとうございました。 動的SQLを使用したのは初めてです。 今後勉強したいと思います。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

k_o_r_o_c_h_a_nさんが回答されているようにカーソル変数(ref cursor)を使用すれば解決できると思います。 カーソルパラメータは条件の定数としては使えます。 #ポイント辞退

myu55
質問者

お礼

ossan_hiroさん、コメントありがとうございます。 k_o_r_o_c_h_a_nさんに教えて頂いた方法でうまくいきました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
回答No.1

作成されたPL/SQLのソースを掲載できないですか? ソースが無い状態でなぜうまく動作しないのかを指摘するのは無理だと思います。 作成したソースを公開するのができないのであれば、サンプル的なソースを作成してみてはどうですか?

myu55
質問者

補足

判りづらくて、すみません。 作成したソースは以下の通りです。 ------------------------------------ BEGIN DECLARE --ソートマスタ CURSOR CURSOR CSR_SORT IS SELECT SORT_ITEM ,SORT_SBT FROM SORT_MST ORDER BY SORT_ORDER; --ソートマスタから取得した値を格納する変数 sort_key VARCHAR2(200):= 'DEFAULT'; --トランから取得した値を格納する変数 item VARCHAR2(200):= 'DEFAULT'; --トラン CURSOR CURSOR CSR_TRN(sort_key IN VARCHAR2) IS SELECT ITM_SBT ,ITEM_COD ,ITEM_NM ,ITM_AMN FROM TRN ORDER BY sort_key; BEGIN --ソートマスタ取得 FOR SORT_REC IN CSR_SORT LOOP IF (sort_key = 'DEFAULT') THEN --取得したレコードの1件目の場合には、そのまま値を格納する sort_key := SORT_REC.SORT_ITEM || ' '|| SORT_REC.SORT_SBT; ELSE --取得したレコードの2件目以降は、カンマをつけてから値を連結する sort_key := sort_key || ','|| SORT_REC.SORT_ITEM || ' '|| SORT_REC.SORT_SBT; END IF; END LOOP; --変数sort_keyを出力してみます DBMS_OUTPUT.PUT_LINE('1.sort_key='|| sort_key); --トラン取得 FOR TRN_REC IN CSR_TRN(sort_key) LOOP IF (item = 'DEFAULT') THEN --取得したレコードの1件目の場合には、そのまま値を格納する item := TRN_REC.ITEM_NM; ELSE --取得したレコードの2件目以降は、カンマをつけてから値を連結する item := item || ','|| TRN_REC.ITEM_NM; END IF; END LOOP; --変数itemを出力してみます DBMS_OUTPUT.PUT_LINE('2.item='|| item); END; END; END; ------------------------------------ データも作成し、試してみました。 ------------------------------------ ソートマスタ SORT_MST ・レコード1 ソート順 SORT_ORDER=1 ソート項目 SORT_ITEM=ITEM_COD ソート種別 SORT_SBT=ASC ・レコード1 ソート順 SORT_ORDER=2 ソート項目 SORT_ITEM=ITM_AMN ソート種別 SORT_SBT=ASC ------------------------------------ ------------------------------------ トラン TRN ・レコード1 商品種別 ITM_SBT=02 商品コード ITEM_COD=222 商品名 ITEM_NM=アイテム1 金額  ITM_AMN=1000 ・レコード2 商品種別 ITM_SBT=02 商品コード ITEM_COD=222 商品名 ITEM_NM=アイテム2 金額  ITM_AMN=500 ・レコード3 商品種別 ITM_SBT=02 商品コード ITEM_COD=111 商品名 ITEM_NM=アイテム3 金額  ITM_AMN=1000 ・レコード4 商品種別 ITM_SBT=01 商品コード ITEM_COD=111 商品名 ITEM_NM=アイテム4 金額  ITM_AMN=100 ------------------------------------ 「トラン」には上記の順序でデータがINSERTされています。 期待する結果は、  1.での出力・・・1.sort_key=ITEM_COD ASC,ITM_AMN ASC  2.での出力・・・2.item=アイテム4,アイテム3,アイテム2,アイテム1 なのですが、実際の出力は  1.での出力・・・1.sort_key=ITEM_COD ASC,ITM_AMN ASC  2.での出力・・・2.item=アイテム1,アイテム2,アイテム3,アイテム4 になってしまいます。つまり、ORDER BY句が効いていません。 お忙しいところ恐れ入りますが、どうぞよろしくお願い致します。

すると、全ての回答が全文表示されます。

関連するQ&A