2011-06-15 60 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