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

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 

사람들이 개 절차는 같은 커서 "MC"를 사용하고, 동일한 모듈에 있습니다. 첫 번째는 커서를 선언하고 선언하고 열고, 두 번째는 RowMC에서 행을 가져옵니다.

가져 오기에 사용 된 DS가 BASED이므로 nullindicator 배열도 있습니다. 이 사람을 도울 수

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 

희망 :

모든 추천하고 LikeDS 매개 변수

처럼, 템플릿으로 복사 파일에 정의되어 있습니다.

+1

이 답변에서 오류를 신속하게 지적하고 싶습니다. 가져 오기 ('Rowmc')에 사용 된 DS는 기반이 아닙니다. 'Rowmc_b'는 기초를두고'Rowmc'의 바로 위에 위치합니다. Based를 사용하는 것은 pre-Template 기법이었습니다. 근본적으로 템플릿을 정의 할 수 있습니다. 귀하의 예제에서'Rowmc_b'와'pNull1'은 불필요합니다. 동일한 설명이 널 표시기 배열 ('NullImc')과 그 주변의 구조에 적용됩니다. – jmarkmurphy

+0

감사합니다 @jmarkmurphy, 당신은 2011 년 대답을 볼 수 있듯이 물의 lto는 다리 아래로 날아갔습니다! 지적 해 주셔서 고마워요, 당신 말이 맞습니다. 지금은 새로운 업데이트 된 답변을 테스트 할 수있는 방법이 없지만 여기에 게시 된 답변은 아직 작동 중입니다. 조금만 중복되어 새로운 것을 작성하고 테스트 할 수있는 방법이 있기를 바랍니다. 많은 감사합니다. ** BASED ** 대답은 오해입니다. 가져 오기가 참조하는 변수는 BASED/템플릿입니다 (템플릿은 TEMPLATE를 정의하기위한 6.1 이전 방법 중 하나입니다). 'Rowmc_b'와 'pNull1'에 대한 권리, probabily copyandpast 오래된 변수. – M4mu5