- PR -

select項目を動的に指定したがfetchできない

1
投稿者投稿内容
maurois
会議室デビュー日: 2004/03/06
投稿数: 13
投稿日時: 2006-10-01 00:29
以下の処理をoracle9iのpl/sqlの動的SQLで実行することを考えています。

  ・select項目を動的に指定
  ・select の結果を複数行取得するため、
   open for と fetch を使用する。

しかし、fetch時には動的SQLが使用できないため、
項目を動的にfetchすることができません。

どうように解決すれば良いか教えて下さい。

【サンプルソース】
set serveroutput on;

declare
type cutype is ref cursor;
cv cutype;
rec テストm%rowtype;
begin

open cv for
'select 「項目を動的に変更する」 from テストm where キー like ata1'
using 'a%';

loop
fetch cv into rec;「fetchできない」
exit when cv%notfound;
dbms_output.put_line (rec.キー);
end loop;

close cv;

end;
/
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-10-02 23:43
FETCHする項目数と型はSELECTと一致させる必要があります

テストm%rowtypeなら項目を絞らず SELECT * でいいように思いますが

上記以外なら
FETCHは最大項目数分にして
動的SQLでSELECTする項目数を最大項目数にします
SELECT項目が最大項目数分でない場合はNULLか固定値を指定して項目数を一致させる

コーディングイメージ
最大3項目をVARCHAR2にしてSELECTする 数字型、日付型はTO_CHARを使用する
TYPE REC IS RECORD(
ITEM1 VARCHAR2(100),
ITEM2 VARCHAR2(100)
ITEM3 VARCHAR2(100)
);
R_REC REC;

OPEN カーソル FOR SELECT A,B,NULL FROM ...
FETCH カーソル INTO R_REC.ITEM1,R_REC.ITEM2,R_REC.ITEM3


[ メッセージ編集済み 編集者: 99ri 編集日時 2006-10-02 23:47 ]
maurois
会議室デビュー日: 2004/03/06
投稿数: 13
投稿日時: 2006-10-07 08:06
99riさん有難うございます。

define_columnのほうがfetchする項目を動的に変更できるので、そちらを使用しようと思います。

さてselect項目が可変であるため、次のような手順を踏みたいのですが、問題ないのでしょうか。
1.select項目をすべてto_charでvarchar型に型変換し、define_columnのvarchar型の変数にすべて格納
  するが、元のデータ型は分かるようにしておく。
2. 上記で格納した変数を使用する時は、元のデータ型に型変換する。

ちなみに、select項目のデータ型は、number か char か varcharです。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-10-07 09:47
DBMS_SQLパッケージのdefine_columnを使用するということでしょうか?

可能と思いますが文字列型に統一する必要はないと思います。
統一すると文字に変換と本来の型に戻すという操作が発生します

define_columnの時に使用したい型が指定できるので
最初から型指定を行えばいいと思います

SELECTカラム順に型タイプを保持するデータ配列を用意する
 型の識別(C:文字 N:数値)、配列の要素番号、カラム名
C,1,カラム名1
C,2,カラム名2
N,1,カラム名3

SELECTで選択するカラムの定義はDEFINE_COLUMN,COLUMN_VALUEで使用

コーディング
1.FETCHデータを収容する変数を定義
FETCHデータを収容するVARCHR2の配列を用意する
 FETCHデータを収容するNUMBER の配列を用意する
2.動的SQL文作成
3.FETCHの場合
カラム名1はVARCHR2配列の1番目、
カラム名3はNUMBER配列 の1番目になるようにコーディングします


[ メッセージ編集済み 編集者: 99ri 編集日時 2006-10-07 10:06 ]
maurois
会議室デビュー日: 2004/03/06
投稿数: 13
投稿日時: 2006-10-07 10:32
>可能と思いますが文字列型に統一する必要はないと思います。
>統一すると文字に変換と本来の型に戻すという操作が発生します

SELECT項目もFROM句も可変なので、文字列型に統一せざるを得ません。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-10-07 10:54
引用:

mauroisさんの書き込み (2006-10-07 10:32) より:

SELECT項目もFROM句も可変なので、文字列型に統一せざるを得ません。



上記はOracleの仕様上の制約から文字列型に統一する必要があるということでしょうか?
そうでないのなら、
「カラムの型をSQL文で文字型に変換してその後再変換するなら、
FETCHするときだけ適切な型に収容してやればいい」の意味合いです

「ご自分のアプリ側の作りなので,御質問の内容で実現可能です」
が私の回答になります。


[ メッセージ編集済み 編集者: 99ri 編集日時 2006-10-07 10:57 ]
1

スキルアップ/キャリアアップ(JOB@IT)