2016-06-17 3 views
0

SQLRPGLE 프로그램 내에서 새로운 레코드 ID가 할당 된 레코드를 복사 한 다른 파일에 일부 레코드를 복사하려면 명령문에 삽입을 실행해야합니다.iSeries : SQLRPGLE SELECT 문의 각 레코드에 대한 프로 시저를 호출하는 방법

1) 각 시간이

 
    D ri_box12  PR   13S 0 
    D wkFileName     10A Value 
2
라고 새로운 기록 ID) 동적 SQL 문
 
    C     EVAL  SQL_STM='insert into PGMR46/STD05GR0F' 
    C         +' (select CART, CARV, ' 
    C         +%char(ri_box12('STD05GR0F')) 
    C         +' from arasso0f)' 
    C/EXEC SQL 
    C+ execute immediate :SQL_STM 
    C/END-EXEC 
3 실행을 얻을 수있는 절차를 프로토 타입)
 
    P ri_box12  B 
    D ri_box12  PI   13S 0 
    D wkFileName     10A Value 
    D wkID   S    13S 0 
    C     DO
** ...some instructions to give wkID a value C ENDDO C Return wkID P E
절차 ri_box12 정의 : 내가 다음 단계를 따라 이렇게하려면 요점은 ri_box12는 한 번만 호출되므로 복사 된 모든 레코드는 동일한 ID를 갖습니다. 프로그램을 여러 번 실행하면 새 레코드 ID로 모든 레코드가 다시 복사됩니다.

무엇이 잘못 되었습니까? 무엇이 누락 되었습니까?

대단히

+1

난 그냥 내 절차가 SQL 문 외부에서 호출되기 때문에 내가 그런 식으로 잘못임을 깨달았다. 따라서, 가능하다면 SQL 문 내에서 호출 할 수있는 내부 SQLRPGLE 프로 시저를 정의하는 방법을 정확히 알지 못합니다. 그렇지 않으면, 나는 다른 것을해야한다고 생각합니다. 도움을 주셔서 감사합니다 – user8444

답변

1

먼저 오프 여기 동적 SQL 사용해야 없습니다보다. 정적 SQL이 작동하고 정적 SQL이 보안 및 성능상의 이유로 선호됩니다.

/free  
exec SQL 
    insert into PGMR46/STD05GR0F 
    select CART, CARV, ri_box12('STD05GR0F') 
    from arasso0f 
end-exec; 

그러나 RPGLE 기능의 CALL이 작동하려면 하나의 항목이 누락되었습니다.

외부 사용자 정의 함수 (UDF)를 정의해야합니다. 이것은 한 단계입니다. 기본적으로 SQL 쿼리 엔진에 RPGLE 함수가 있는지와 인터페이스가 어떤 모습인지 알려줍니다.

일반적으로 위의 INSERT 문은 ri_box12() 기능과 동일한 프로그램에 포함되지 않습니다. 일반적으로 당신은

  1. 이 (PGM 또는 *)는 * SRVPGM을 만들 수 있도록 같은 과정 ri_box12()를 포함하는이있을 것이다
  2. UDF)가 (UDF를 사용
  3. 프로그램을 생성/저장 프로 시저를 ri_box12 가리키는 만들

3 단계는 INSERT SQL 문을 포함하는 프로그램입니다.

create function ri_box12(
    filename char(10) 
) returns numeric(13,0) 
    language RPGLE 
    parameter style general 
    returns null on null input 
    program type sub 
    external name 'MYSRVPGM(RIBOX_12)'; 

당신은/기능에 대해 지정해야 할 다른 설정이 많이있다 :

2 단계는 단순히 그렇게 모양을 SQL 문을 실행 중입니다. SQL 참조 설명서의 CREATE FUNCTION (External Scalar) 섹션을 살펴보십시오.

나는 또한 높은 External Procedures, Triggers, and User-Defined Functions on IBM DB2 for i Redbook

+0

답변 해 주셔서 대단히 감사합니다. SQL Reference Redbook을 읽었음에도 불구하고 당신의 말은 제가 조각을 모두 넣는데 도움이되었습니다. 내 외부 프로그램을위한 UDF 함수를 만들지 않고 그것을 할 수있는 방법이 있기를 바랬다. – user8444

0

확실하지 않음을 읽어 보시기 바랍니다하려는 OP에서 함수 ri_box12이 무엇을하지만, 그 효과를 달성하기위한 가능한 수단으로 SQL의 시퀀스는 일련 번호가 단지 경우; 예는 다음과 같은 스크립트 SQL을 참조하십시오

drop table qtemp.nbrs ;       
drop table qtemp.junk ;       
drop sequence myseq ;        
create table qtemp.nbrs (n int)   ;   
insert into qtemp.nbrs values(10), (20), (30) ; 
create table qtemp.junk (s int, i int) ;   
create sequence myseq as integer start with 1 ; 
insert into qtemp.junk       
select next value for myseq, n from qtemp.nbrs ; 
select * from qtemp.junk 
; -- report from the above SELECT query follows: 
     S    I 
     1    10 
     2    20 
     3    30 

IBM i 7.2->Database->Reference->SQL reference->Concepts->Sequences
IBM i 7.2->Database->Reference->SQL reference->Statements->CREATE SEQUENCE
IBM i 7.2->Database->Reference->SQL reference->Language elements->Expressions->Sequence reference

+0

안녕 CRPence, 답변 해 주셔서 감사합니다. 그러나 단순히 일련 번호가 아닙니다. 시퀀스는 문서 번호 매기기를위한 복잡한 시스템이므로 입력 매개 변수에 따라 다릅니다. 어쨌든 필자는 필자의 목적을 달성 할 수있었습니다 : 모든 기능을 포함하고 메인없이 RPGLE 서비스 프로그램을 작성하고 SQL 기능이 허용되는 모든 곳에서 작동하는 새로운 SQL 함수를 작성했습니다. 누구나 필요할 경우 전체 명령과 사양을 제공 할 수 있습니다. 감사합니다. – user8444