0 Replies Latest reply: Dec 17, 2012 9:14 PM by 922045 RSS

    動的SQL使用時にFETCHされない場合がある

    922045
      こんにちは、はじめまして。

      PL/SQLにて、ワークテーブルに出力するための処理を行なっており、
      内部では動的SQLをREF CURSORとBULK FETCHを使用しております。

      基本的な動作はしているのですが、特定の条件で検索を行った時のみ、
      本来1件のデータがあるはずなのですが、データが取れず、
      対象のデータがワークテーブルに出力されない問題に遭遇しており、
      解決できず困っております。
      実際に動的SQLにて組み上げたSQLを、採取しSQLPLUSにて実行してみると、
      1件のデータが抽出されるため、SQL自体に誤りは無いと思います。

      概略ではありますが、以下のようなプログラムとなっております。
      FUNCTION fnc_create_work(
           inm_UserId               IN          NUMBER,
           inm_TrnNo               IN          NUMBER,
           inm_Kbn                    IN          NUMBER,
           inm_DaibunruiF          IN          NUMBER DEFAULT NULL,
           inm_DaibunruiT          IN          NUMBER DEFAULT NULL,
           inm_ChubunruiF          IN          NUMBER DEFAULT NULL,
           inm_ChubunruiT          IN          NUMBER DEFAULT NULL,
           inm_ShobunruiF          IN          NUMBER DEFAULT NULL,
           inm_ShobunruiT          IN          NUMBER DEFAULT NULL,
           ivc_HinNo               IN          VARCHAR2 DEFAULT NULL,
           inm_JanCd               IN          NUMBER DEFAULT NULL,
           inm_NendoF               IN          NUMBER DEFAULT NULL,
           inm_NendoT               IN          NUMBER DEFAULT NULL,
           ivc_Season               IN          VARCHAR2 DEFAULT NULL,
           inm_HanbaiKknF          IN          NUMBER DEFAULT NULL,
           inm_HanbaiKknT          IN          NUMBER DEFAULT NULL,
           inm_KykKbn               IN          NUMBER DEFAULT NULL,
           inm_ToriCd               IN          NUMBER DEFAULT NULL,
           inm_KyByCd               IN          NUMBER DEFAULT NULL,
           ovc_ErrKbn               OUT          VARCHAR2,
           ovc_ErrCode               OUT          VARCHAR2,
           ovc_ErrMsg               OUT          VARCHAR2
      )RETURN NUMBER
      IS
           wvc_progname          VARCHAR2(30) DEFAULT 'fnc_create_work';
           
           -- カーソル行用オブジェクト定義
           TYPE hclst_type IS TABLE OF INSERT_WK%ROWTYPE;
           -- カーソル行変数定義
           hclst_rec               hclst_type;
           
           -- カーソル用オブジェクト定義
           TYPE hc_cur_type IS REF CURSOR;
           -- カーソル変数定義
           cur_hc                    hc_cur_type;
           
           wvc_Sql                    VARCHAR2(32767);
           wbl_JyokenFlg          BOOLEAN DEFAULT FALSE;
           wnm_Idx                    NUMBER;
           wnm_cnt                    NUMBER;
           
      BEGIN

      wvc_Sql := '';
          wvc_Sql := wvc_Sql || ' SELECT * ';
      wvc_Sql := wvc_Sql || ' FROM INSERT_SRC '
      wvc_Sql := wvc_Sql || ' WHERE HACHUNO = ' || inm_HachuNo || ' ';
           
           DEBUG_WRITE(
                'SPZS1001',
                SUBSTR(wvc_Sql, 1, 1900),
                SUBSTR(wvc_Sql, 1901, 1900),
                SUBSTR(wvc_Sql, 3801, 1900),
                SUBSTR(wvc_Sql, 5701, 1900),
                SUBSTR(wvc_Sql, 7601, 1900),
                SUBSTR(wvc_Sql, 9501, 1900),
                SUBSTR(wvc_Sql, 11401, 1900)
           );
           
           -- SQL実行
           OPEN cur_hc FOR wvc_Sql;
           LOOP
                -- カーソルを1,000件ずつバルクフェッチする
                FETCH cur_hc BULK COLLECT INTO hclst_rec LIMIT 1001;

      DEBUG_WRITE(gvc_program_id, 'P1', cur_hc%ROWCOUNT, hclst_rec.COUNT);
                
                -- 存在チェック
                IF hclst_rec.COUNT = 0 THEN
                     CLOSE cur_hc;
                     
                     -- 検索データ無
                     RAISE gexp_notfound_data;
                ELSIF hclst_rec.COUNT > 1000 THEN
                     CLOSE cur_hc;
                     
                     -- 出力件数オーバー(1000件以上)
                     RAISE gexp_record_overflow;
                END IF;
                
                -- 登録処理
                FORALL nLoopCnt IN 1 .. hclst_rec.COUNT
                     INSERT INTO INSERT_WK VALUES hclst_rec(nLoopCnt);
                
                EXIT;
           END LOOP;
           CLOSE cur_hc;
           
           RETURN 1;
           
      EXCEPTION
           WHEN gexp_notfound_data THEN
                IF cur_hc%ISOPEN THEN
                     CLOSE cur_hc;
                END IF;
                RETURN gnm_err_notfound_data;
                
           WHEN gexp_record_overflow THEN
                IF cur_hc%ISOPEN THEN
                     CLOSE cur_hc;
                END IF;
                RETURN gnm_err_record_overflow;
                
           WHEN OTHERS THEN
                IF cur_hc%ISOPEN THEN
                     CLOSE cur_hc;
                END IF;
                RETURN gnm_err_exception;
      END fnc_create_work;

      組み上げたSQLについては、かなり省略されて頂いておりますが、
      必要であれば、もう少し本物に沿ったサンプルをアップ致します。

      Windows 20003 Server SP2
      Oracle Database Standard Edition 10.2.0.1.0

      来週には、テストリリースを控えており、最終のテストをしていく中で発覚した問題で、
      現在非常に切羽詰まっている状態です。何卒、お力添えを宜しくお願い致します。