こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PL/SQLにて、マスタから取得した値をORDER BY句に指定したい

どなたかお判りになる方、ご教示ください。
★やりたいこと
PL/SQLにて、マスタから取得した値をORDER BY句に指定したい。
(例)以下のようなマスタがあるとします。
--------------------------
ソートマスタ SORT_MST
ソート順 SORT_ORDER
ソート項目 SORT_ITEM
ソート種別 SORT_SBT
--------------------------
この「ソートマスタ」の「ソート項目」には、以下のトランザクションテーブルの物理カラム名が格納されています。
--------------------------
トランTRN
商品種別 ITM_SBT
商品コードITEM_COD
商品名 ITEM_NM
金額  ITM_AMN
--------------------------

PL/SQLにて「ソートマスタ」から値取得後、「ITEM_COD ASC,ITM_AMN ASC」という文字列を作成し、「トラン」検索時にORDER BY句に指定したのですが、ORDER BY句が全く効いてくれません。

お忙しいところ恐れ入りますが、ご存知の方、よろしくお願い致します。

投稿日時 - 2006-10-03 21:06:15

QNo.2449025

暇なときに回答ください

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

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;
動くつもりで書いたけど、テストしてない。
(エラー処理を端折っているので、ご注意ください)

投稿日時 - 2006-10-04 01:22:26

お礼

k_o_r_o_c_h_a_nさん、ご教示ありがとうございます。

ちょっと直して実行したところ、うまくいきました。
本当に助かりました!ありがとうございました。

動的SQLを使用したのは初めてです。
今後勉強したいと思います。

投稿日時 - 2006-10-04 14:06:44

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

#ポイント辞退

投稿日時 - 2006-10-04 09:51:39

お礼

ossan_hiroさん、コメントありがとうございます。

k_o_r_o_c_h_a_nさんに教えて頂いた方法でうまくいきました。

どうもありがとうございました。

投稿日時 - 2006-10-04 14:07:51

ANo.1

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

投稿日時 - 2006-10-03 21:15:24

補足

判りづらくて、すみません。
作成したソースは以下の通りです。
------------------------------------
BEGIN
DECLARE
--ソートマスタ CURSOR
CURSOR CSR_SORT IS
SELECTSORT_ITEM
,SORT_SBT
FROMSORT_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句が効いていません。

お忙しいところ恐れ入りますが、どうぞよろしくお願い致します。

投稿日時 - 2006-10-03 21:26:50

あなたにオススメの質問