2016-07-29 6 views
0

日付範囲を折りたたみ、iteselfでSQLを実行しているときに、そしてそれをネストしたテーブルに挿入するときに、プロシージャ私は他の行に折りたたまれていたはずの行を取得しています。異なる場所で実行された同じステートメントから2つの異なる行数を取得しています

client_pk PLAN_ID GRP start_dt end_dt 
8752  25171 3 1/1/2016 3/31/2016 
8752  25171 1 2/1/2016 1/31/2016 

と終了することにより、スタンドアローンのクエリ

として実行すると、それが適切に折りたたまれている:私は、最初の結果はのROWNUMを与えるために、最も内側のクエリから設定されているので、

  SELECT client_pk, 
        plan_id, 
        grp, 
        MIN(start_dt) start_dt, 
        MAX(end_dt) end_dt 
       FROM (
       SELECT client_pk 
         plan_id, 
         start_dt, 
         end_dt, 
         MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp 
        FROM (
        SELECT mp.client_pk, 
          mp.plan_id, 
          CASE 
           WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND 
                                 NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) 
            THEN NULL 
          ELSE ROWNUM 
          END grp, 
          mp.start_dt, 
          NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt 
         FROM client_plan mp 
         ) 
        ) 
       GROUP BY grp, plan_id, client_pk 

client_pk PLAN_ID GRP start_dt end_dt 
8752  25171 3 1/1/2016 3/31/2016 

しかし、これらのレコードを最終的にDBに挿入されるネストした表にダンプするプロシージャを実行すると、両方の行が戻されます。

SELECT plan_spans_obj(client_pk, plan_id, start_dt, end_dt) 
     BULK COLLECT INTO plan_spans_ins_tbl 
     FROM ( 
     SELECT client_pk, 
       plan_id, 
       start_dt, 
       end_dt 
     FROM (SELECT client_pk, 
         plan_id, 
         grp, 
         MIN(start_dt) start_dt, 
         MAX(end_dt) end_dt 
        FROM (
        SELECT client_pk 
          plan_id, 
          start_dt, 
          end_dt, 
          MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp 
         FROM (
         SELECT mp.client_pk, 
           mp.plan_id, 
           CASE 
            WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND 
                                  NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) 
             THEN NULL 
           ELSE ROWNUM 
           END grp, 
           mp.start_dt, 
           NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt 
          FROM client_plan mp 
          ) 
         ) 
        GROUP BY grp, plan_id, client_pk 
       ) 
      ); 

それでは、どのように私はちょうど異なっ実行、同じクエリの2つの異なる結果を、取得しています、それが実行された場所に応じた操作異なるの順です。

また、余分なレコードは基本的に負の期間です。終了日は開始日より前ですが、これはクエリで処理されます。

+0

そのclient_pkとplan_idの生データを追加できますか?私はあなたが 'ROWNUM'を酷使しているからだと確信していますが、書き直す前に再現できるようにしたいと思います。 –

答えて

0

答えは私がコレクションを初期化しなかったことでした。そのようなものだとは思えませんが、明らかにそうです。今働いているようだ。

+0

コレクションを一括して収集する前に、コレクションを初期化する必要はありません。多分あなたはコミットされていない変更や何かを持っていたでしょうか?まだそれが動作する限り.. –

+0

コミットされていない変更も私の最初の考えだった...誰が知っている。 – mathguy

関連する問題