2017-08-02 4 views
0

問題があり、その解決策を見つけることができません。私は先週PL/SQLで作業を始めました。つまり、私の能力は非常に限られています。それは変更を必要しかし2つのカーソルを使用してPL/SQLを表示する方法

select 
     '7' as M_ID, 
     N_PROT as SUBSCRIPTION_VERSION_ID, 
     /* ..... bunch of other business logic */ 
    from N_TRANS 
    where (CORA in ('0215','0320') or CORA in ('0215', '0320')) 
    and N_PROT IS NOT null; 

を検索するだけで、最後のID(S_ID)NUMBER(N_PROT)によってグループ化:

とにかく、私は別のものに、エクスポートするテーブルを書式設定作業のスクリプトを持っていました。だから、私はNUMBER(N_PROT)によってテーブルから最後のID(S_ID)グループを検索するために別のseparetedのスクリプトをした:

declare 
     cursor S_CURS IS 
      select 
       max(S_ID) keep(dense_rank LAST order by N_PROT) S_ID, 
       NR_PROTOCOLO 
      from N_TRANS 
      group by N_PROT 
      order by S_ID; 

    S_HIST_T S_CURS%ROWTYPE; 
    type NTT_S_HIST_TRANS is table of S_HIST_T%type; 
    LLL_S_HIST_TRANS NTT_S_HIST_TRANS; 

    begin 
     open S_CURS; 
     fetch S_CURS bulk collect into LLL_S_HIST_TRANS; 
     close S_CURS; 
     for indxx in 1..LLL_S_HIST_TRANS.count loop 
      --The IDs as a var 
      DBMS_OUTPUT.PUT_LINE(LLL_S_HIST_TRANS(indxx).S_HIST_T); 
     end loop; 
    end; 

と問題は、私は、この2つのスクリプトに参加する方法です。それを解決するための1つの方法は、で、2番目のスクリプト(¹)のループ内で最初のスクリプトを実行することでした。

declare 
     cursor S_CURS IS 
      select 
      ...  
    begin 
     ... 
     for indxx in 1..LLL_S_HIST_TRANS.count loop 
      --The IDs as a var 
      select 
      '7' as M_ID, 
       N_PROT as SUBSCRIPTION_VERSION_ID, 
       /* ..... bunch of other business logic */ 
      from N_TRANS 
      where (CORA in ('0215','0320') or CORA in ('0215', '0320')) 
      and N_PROT IS NOT null 
      and S_ID = LLL_S_HIST_TRANS(indxx).S_HIST_T; -- (¹) 
     end loop; 
    end; 

こうして、このようにして、内部のSELECTを保存して結果をエクスポートする方法を説明します。それは良い習慣ではないことは分かっていますが、私は何か良いものを考え出すことができませんでした。 誰かが私にこれを解決する方法についての他の視点を与えることができたり、私が思いついたこの解決策を手伝ったりすることができれば、それは素晴らしいことでしょう!

問題を再開するには、スクリプトを既に起動して実行していましたが、同じことをするために変更する必要がありましたが、最後のIDだけで済む条件を追加する必要がありました。 IDを取得してカーソルでそれらを分離できるスクリプトを作成しましたが、今ではこのIDを最初のスクリプトに組み込む必要があります。

ありがとうございました!

答えて

1

データをあるテーブルから別のテーブルに「エクスポート」して選択した場合、「選択として挿入」を試してみてはいかがですか?

insert into your_new_table select <your_data> from N_TRANS where ... 
0

あなたはこのような何か必要があるように見える:

select m_id, n_prot, etc 
from (select '7' as m_id 
       , n_prot as subscription_version_id 
       , /* ..... bunch of other business logic */ 
       , row_number() over(partition by n_prot order by s_id desc) as seq 
     from n_trans 
     where (cora in ('0215', '0320') or cora in ('0215', '0320')) 
     and n_prot is not null) 
where seq = 1 
+0

を返信いただきありがとうございます、私は明確ではなかった場合、私は申し訳ありませんが、それは私が必要なものではありません。あなたが書いた内部選択([...]は、m_idとして '7'を選択します 、n_protはsubscription_version_id [...])は外部でなければならず、カーソル選択からのIDのみを使用します。 – RochaRF

+0

おそらく同じデータと結果が問題をより明確にするでしょう。上記は、「セットごとの最後の行」フィルタリングの一般的なパターンです。 –

1
begin 
    for cv1 in (select 
        max(S_ID) keep(dense_rank LAST order by N_PROT) S_ID,    
        NR_PROTOCOLO 
       from N_TRANS 
       group by N_PROT 
       order by S_ID) 
    loop 
    for cv2 in (select 
       '7' as M_ID, 
       N_PROT as SUBSCRIPTION_VERSION_ID, 
       /* ..... bunch of other business logic */ 
       from N_TRANS 
       where (CORA in ('0215','0320') or CORA in ('0215', '0320')) 
       and N_PROT IS NOT null 
       and S_ID = cv1.S_ID) 
    loop 
     -- Processing logic here. To access either loop's data, 
     -- prefix the column with cv1 or cv2, like cv2.M_ID, cv1.NR_PROTOCOLO 
    end loop; 
    end loop; 
end; 
関連する問題