
どなたかお判りになる方、ご教示ください。
★やりたいこと
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句が全く効いてくれません。
お忙しいところ恐れ入りますが、ご存知の方、よろしくお願い致します。
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;
動くつもりで書いたけど、テストしてない。
(エラー処理を端折っているので、ご注意ください)
k_o_r_o_c_h_a_nさん、ご教示ありがとうございます。
ちょっと直して実行したところ、うまくいきました。
本当に助かりました!ありがとうございました。
動的SQLを使用したのは初めてです。
今後勉強したいと思います。
No.3
- 回答日時:
k_o_r_o_c_h_a_nさんが回答されているようにカーソル変数(ref cursor)を使用すれば解決できると思います。
カーソルパラメータは条件の定数としては使えます。
#ポイント辞退
ossan_hiroさん、コメントありがとうございます。
k_o_r_o_c_h_a_nさんに教えて頂いた方法でうまくいきました。
どうもありがとうございました。
No.1
- 回答日時:
作成されたPL/SQLのソースを掲載できないですか?
ソースが無い状態でなぜうまく動作しないのかを指摘するのは無理だと思います。
作成したソースを公開するのができないのであれば、サンプル的なソースを作成してみてはどうですか?
この回答への補足
判りづらくて、すみません。
作成したソースは以下の通りです。
------------------------------------
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句が効いていません。
お忙しいところ恐れ入りますが、どうぞよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- Excel(エクセル) excel マクロでグループ内でソートしたい。見出しが上手くいきません。 7 2022/05/22 08:31
- その他(プログラミング・Web制作) sortの優先キーについて(スプレッドシート) 1 2023/01/17 17:59
- PostgreSQL SQLで検索結果の記事を表示したい 1 2022/04/28 21:03
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Oracle Oracleですがsqlで質問です。 サブクエリ内で番号というカラムで昇順の1レコード目を取得したい 3 2023/05/22 10:02
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS VBAでループ中に制御を...
-
PL/SQLにて、マスタから取得し...
-
Texの枠囲み調節
-
PL/SQLのOPEN cursor_name FOR...
-
エクセルVBAでUserFormを起動し...
-
Accessのマクロでモジュールを...
-
roleの権限確認方法
-
Oracle8iで順序の値のリセット
-
SQLで部分的にGROUP BYしたいとき
-
wordの差し込み印刷での日付表示
-
SQLserver算術オーバーフロ...
-
Excelのピボットテーブルで数も...
-
TO_DATEの使い方を教えて下さい
-
イベントプロシージャが動作しない
-
PL/SQLで、期間計算
-
(日付 - 日付)/数値
-
Oracleのことなのですが。
-
関数IFで、指定日付範囲のデー...
-
SQLがうまくいかない!
-
Accessでのイベントプロシージャ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
カーソルで集合関数を使った場...
-
ORA-00904:無効な識別子の回避...
-
PL/SQLのOPEN cursor_name FOR...
-
PL/SQLにて、マスタから取得し...
-
[Oracle9i]PL/SQLでFETCHしても...
-
PL/SQLのカーソルについて
-
PL/SQL カーソルのFROM句にカー...
-
PL/SQLでFORの働き
-
カーソルループ内部でログを出力
-
自動連番でカラムを更新したい
-
カーソルフェッチにて、最終レ...
-
PL/SQLプログラムの書き方がわ...
-
処理の結果レコードがなかった...
-
T-SQLのカーソルで
-
【PL/SQL】CURSOR ・・・ IS SE...
-
文字列の置換
おすすめ情報