2017-08-02 32 views
0

我遇到問題,無法找到解決方案。我在上週開始使用PL/SQL,這意味着我的能力非常有限。如何使用兩個遊標並顯示它們PL/SQL

不管怎麼說,我有這樣的格式化的表格要導出到另一個工作腳本:只有最後一個ID(S_ID)由NUMBER(N_PROT)分組

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; 

但它需要改變搜索。於是,我做了另一個separeted腳本從表中的最後一個ID(S_ID)組由數字(N_PROT)搜索:

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; 

,問題是我怎麼會加入這個兩個腳本。我想到的一種可能的解決方法是使用在第二個腳本(¹)中執行循環中的第一個腳本。這樣的事情:

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; 

因此,這樣,我將如何保存內幕選擇並導出結果。我知道這不是一個好習慣,但我不能想出更好的東西。 如果有人可以給我一些關於如何解決這個問題或者幫助我解決這個問題的其他觀點,那就太棒了!

只是爲了恢復該問題,我已經啓動了一個腳本並運行了,並且需要將其更改爲執行相同的操作,但添加了只能使用最後一個ID的條件。我製作了一個能夠獲得ID並用光標隔離它的腳本,現在,我必須將這些ID包含在第一個腳本中。

謝謝!

回答

1

如果您想將數據從一個表格導出到另一個表格,並且您有選擇,爲什麼不嘗試使用「insert as select」?

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

謝謝你的回覆,我很抱歉,如果我還不清楚,但是這不是我所需要的。您所寫的內幕選擇([...]選擇'7'爲m_id ,n_prot as 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; 
相關問題