SQL에 대한 forEach 고려사항
EGL forEach 문은 각 행에 대해 EGL 문을 수행하면서 SQL 결과 세트 전체를 읽습니다. 이전에 EGL
open 또는 get 문을 사용하여 결과 세트를 작성했어야 합니다.
결과 세트를 사용할 수 없는 경우에는 명령문을 처리할 수 없으며 하드 I/O 오류가 발생합니다. 다음 이벤트 중 하나가 발생할 때까지 루프가 계속됩니다.
- 모든 행이 검색되었습니다.
- exit 문이 실행됩니다.
- 하드 또는 소프트 오류가 발생합니다.
대부분의 경우 EGL 런타임은 루프의 마지막 반복 후에 암시적 SQL CLOSE 문을 실행합니다. 이 암시적 명령문은 SQL 시스템 변수를 수정하므로, SQL 관련 시스템 변수의 값을 forEach 문의 본문에 저장해야 합니다.
noRecordFound 이외의 오류가 발생하여 forEach 문이 종료되는 경우, EGL 런타임은 SQL CLOSE 문을 수행하지 않습니다.
구문

- label
- continue 또는 exit 문이 참조할 수 있는 레이블과 콜론입니다. 자세한 정보는 조건문 및 루프 명령문의 내용을 참조하십시오.
- sqlRecord
- 결과 세트를 작성한 open 또는 get 문에서 참조한 SQL 레코드 변수입니다. SQL 레코드 또는 결과 세트 ID를 지정해야 합니다.
- resultSetID
- 현재 읽으려는 결과 세트를 작성한 open 또는 get 문에 사용자가 선택하여 제공한 ID입니다.
- target
- EGL이 생성하는 SQL INTO 절은 사용자가 여기에 지정하는 정보를 사용합니다. 이들은 결과 세트의 각 행에 대해
forEach 문이 생성하는 SQL FETCH 문으로부터 값을 수신하는 EGL 호스트 변수입니다. 사용자가 레코드 이름을 지정하면
EGL은 해당 레코드의 모든 필드를 사용합니다. 호스트 변수의 이름 앞에 콜론을
포함하지 마십시오(호스트 변수 참조).
이 컨텍스트에서 INTO 절을 작성하면 관련 open 문에서 모든 INTO 절이 대체됩니다.
- statement
- EGL 언어에서 결과 세트의 각 행에 대해 수행할 명령문입니다.
예제
다음 예제는 고객 파일에서 데이터베이스 레코드를 변경하는 프로세스를 표시합니다.
vgVar.handleHardIOErrors = 1;
try
open myResults for myCustomer
with #sql{
SELECT customer_number, customer_name
FROM Customer
WHERE customer_number >= :myCustomer.customerNumber
FOR UPDATE OF customer_name
}
into myCustomer.customerNumber, myCustomer.customerName;
onException(sqlEx SQLException)
myErrorHandler(6); // exits program
end
try
forEach (from myResults)
// make last name first
reverseName(myCustomer.customerName);
try
execute
#sql{
UPDATE Customer
SET customer_name = :myCustomer.customerName
WHERE CURRENT OF myResults
};
onException(sqlEx SQLException)
myErrorHandler(10); // exits program
end end
onException(sqlEx SQLException)
myErrorHandler(8); // exits program
end
sysLib.commit();
오류 조건
SQLCODE 100은 일치하는 데이터를 발견하지 못했음을 표시합니다. 이 오류는 forEach 블록을 정상적으로 종료합니다. EGL은
이 환경에서 forEach와 관련된 onException 블록을 실행하지 않습니다. 다음 예제에서처럼
테스트로 onException 블록을 시작할 필요는 없습니다.
onException(sqlEx SQLException)
if (sqlcode != 100) // unnecessary test