プロが教えるわが家の防犯対策術!

[環境]
db:oracle 11g express edition
os:windowsXP
言語:PLSQL

[質問]
PLSQLを使用したプログラムを作成していたのですが、SQLの文字数がVARCHAR2(32767)で宣言した変数の文字数を超えてしまいエラーとなります。
理由としては、引数で受け取った配列の数分だけUNIONでSQLを結合し、変数に格納しているのですが、配列の量が多いと変数の最大文字列を超えてしまうようです。(ソースイメージは下記に記述)

対応としては、変数を分割し、SQLを実行することや、SQLを組みなおすなどの対応が考えられるのですが、”(1)処理速度の都合上、できれば1度のSQLで実行したい。”、”(2)抽出条件が配列の条件によって、複雑に変わることと、既に稼働しているプログラムの為あまりソースを変更したくない”という理由から検索条件は変えずに、1度のSQLでどうにか実行できないかと考えています。
上記条件をクリアする何か良い方法はありますでしょうか?
(もし、1回のSQLで実行は難しいのであれば、最悪配列を使用してSQLを分割して対応しようとは思っています。ただ、他に方法があるのであればそれに越したことはないです。)

どなたか良い方法をご存知の方がおりましたら教えていただけないでしょうか?
宜しくお願い致します。


[ソースイメージ]

<引数>
配列[100];          <-- 条件が格納された配列

<変数定義部>
hensu_union VARCHAR2(32767); <-- 結合したSQLを格納
hensu_where VARCHAR2(1000); <-- SELECTの条件の格納

<プログラム部>
 <省略>
 .
 .
 .
  FOR i IN 1..配列分 LOOP <-- 配列の数分、UNIONでSQLを結合

IF i > 1 THEN
hensu_union := hensu_union || 'union ';
END IF;

hensu_union := hensu_union || 'select A,B,C .... from マスタA、マスタB WHERE ' ||
hensu_where ;  ←ここのUNIONで結合しすぎると最大文字列を超えエラー

 END LOOP;



 省略


 
OPEN カーソル名 FOR hensu_union ; ←SQLを実行する部分でどうにか1回で済ませたい。
                   VARCHAR2を超えるような文字列を格納できたり、
                   他の良い方法はあるのか?

A 回答 (1件)

SQLが長くなりすぎること自体を解消できたほうがいいのでしょうが、


詳細な内容が分からないので、プログラム的な解決方法です。

Oracle11gから動的SQLで実行するSQLにCLOB型を使用することができるようになっています。
http://docs.oracle.com/cd/E16338_01/appdev.112/b …

ですので、hensu_unionをVARCHAR2ではなくCLOBにすれば文字列長の制限を回避できるのではないかと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!