2011-06-15 56 views
1

我想將遊標和數據結構傳遞給過程,然後過程使用sql遊標的下一行填充結構。這可能嗎?下面是我試圖達到的模板。使用RPG變量作爲遊標名稱執行SQL語句

***************************************************** 
    * 
    * Fetch the next row from a cursor 
    * 
    * @param cursor - the name of the cursor 
    * @param structure - the data structure to hold the fields 
    ***************************************************** 
pfetchNextRow  B 
DfetchNextRow  PI    N 
d cursor      32767A varying const 
d structure  DS     ???????    
    /free 
    exec sql 
     fetch next from :cursor into :structure 
    ; 

    if (sqlstate = SQL_SUCCESS); 
     return *on; 
    else; 
     exec sql 
     close :cursor; 
     return *off; 
    endif; 

    /end-free 
pfetchNextRow  E 

我該如何傳遞光標,以及如何定義數據結構參數?

回答

0

我不確定您是否可以動態定義遊標。提出這個問題的好地方是RPG400-L。 RPG編譯團隊的成員經常回答這樣的問題。

+0

謝謝,我註冊了他們 – jax 2011-06-15 22:51:40

1

我不知道您是否在其他網站上收到了答案,但其他網站可能需要它。

遊標存在於「GLOBALLY」中,但只有在它們被聲明的模塊中,您並不需要將它傳遞給此模塊中的過程,您聲明的遊標始終可用,直到它關閉或作業結束。

你可以做這樣的事情(只要你是在同一個模塊):

P SQLprep_mC  B     EXPORT 
D SQLprep_mc  PI     Like(g_retCode) 
D strInSQL       Like(string_MAX_V) 

    /Free 
    exec SQL 
    SET OPTION 
     CLOSQLCSR = *ENDACTGRP; 
    exec sql prepare p1 from :strINsql ; 
    //.... declare and open 
    /End-Free 

P SQLprep_mC  E 



P SQLfetch_mC_st B     EXPORT 
D SQLfetch_mC_st PI     Like(g_retCode) 
D Row        LikeDs(dsSql_0) 
D NullI       Like(sqlNI_0) Dim(DSSql0_nFields) 

D Rowmc_b   DS     LikeDs(dsSql_0) Based(pNull1) 
D Rowmc   DS     LikeDs(dsSql_0) 
D pNUll1   s    * inz(%ADDR(Rowmc)) 
D SQLind   s     Like(sqlNI_0) Based(pNull2) 
D NullImc   S     like(SQLind) Dim(DSSql_nFields) 
D pNull2   s    * inz(%ADDR(NullImc)) 

    /free 
    exec SQL fetch next from mC into :Rowmc :NullImc ; 
    Row = Rowmc ; 
    NullI = NullImc ; 
    /end-free 

P SQLfetch_mC_st E 

那些2名的程序使用相同的光標「MC」,並且是同一模塊中。 第一個準備,聲明和打開遊標,第二個取Row Row中的行。

正如您所看到的用於提取的DS是BASED,也是NULLindicator Array。

所有喜歡和LikeDS參數在一份文件作爲模板中定義,如:

D comfraf  e DS     extname(comfra00f) QUALIFIED TEMPLATE 
D dsSql_0   DS     Qualified TEMPLATE 
D cid        like(comfraf.cid  )    
D ccap        like(comfraf.ccap )    

D sqlNI_0   s    5I 0 TEMPLATE 

希望這可以幫助別人。

+1

只是想快速指出這個答案中的錯誤。用於提取的DS('Rowmc')不是基於。 'Rowmc_b'是基於,並且直接放在'Rowmc'之上。 Using Based是一種預模板技術,用於定義基本上是模板的內容,只要您從不基於任何內容即可。在你的例子中,'Rowmc_b'和'pNull1'是不必要的。相同的註釋適用於Null Indicator數組('NullImc')及其周圍的結構。 – jmarkmurphy 2015-10-30 19:46:59

+0

謝謝@ jmarkmurphy,正如你可以看到2011年的答案,一滴水已經飛過橋下!謝謝你指出,你是對的。目前,我沒有辦法測試一個新的更新答案,這裏發佈的答案仍然有效,但有點多餘,希望有一種方法來編寫和測試一個新的答案。非常感謝。對於** BASED **答案只是一個誤解,我的意思是,取指所指的變量是BASED /模板(基於6.1之前定義模板的方法之一)。 'Rowmc_b'和'pNull1'的權利,可能是copyandpast舊的變量。 – M4mu5 2015-11-23 09:27:26