DL/I에 대한 get 고려사항
DL/I의 컨텍스트에서 EGL get 문은 DL/I 데이터베이스에서 단일 세그먼트를 검색합니다.
이 명령문에는 나중에 코드에서 저장된 데이터를 대체하거나 삭제하는 데 사용할 수 있는 forUpdate 옵션이 있습니다. 또한 이 명령문을 사용하여 DL/I 세그먼트 세트를 검색하고 각 연속 세그먼트의 컨텐츠를 동적 배열의 다음 DLISegment 레코드에 배치할 수도 있습니다.
get 문은 DL/I GU(get unique) 문을 생성합니다. get...forUpdate 문은 DL/I GHU 문을 생성합니다.
- 세그먼트의 데이터로 보고서 또는 송장 인쇄와 같은 작업을 수행하기 위해 세그먼트를 읽습니다.
- EGL 키워드 delete 또는 replace를 사용하여 세그먼트를 제거하거나 업데이트하기 위해 세그먼트를 보유합니다(forUpdate 옵션과 결합). 대부분의 경우, 레코드를 add하기 전에 get 문을 수행할 필요가 없습니다.
DL/I에 대해 get...forUpdate 문을 사용하는 예제는 DL/I에 대한 delete 고려사항의 내용을 참조하십시오.
get myCustomer, myLocation, myOrder;
EGL은 이 명령문에서
다음 의사 DL/I 코드를 생성합니다. GU STSCCST*D (STQCCNO = :myCustomer.customerNo)
STSCLOC*D (STQCLNO = :myLocation.locationNo)
STPCORD
DLISegment 레코드의 동적 배열을 get 문의 오브젝트로 지정하는 경우, 배열의 첫 번째 레코드에 대해 DL/I GU 호출을 생성하고 배열의 각 후속 레코드에 대해 GN 호출을 생성합니다. 배열이 많은 요소를 지정하지 않는 경우, 이 명령문은 DL/I 파일의 끝 또는 오류 코드가 발생할 때까지 GN 호출을 생성합니다.
구문

- positionOption
- next 및 next inParent 위치 옵션은 DL/I의 get 문에 대해 유효합니다. 자세한 정보는 이 주제의 "위치 옵션"을 참조하십시오.
- DLISegmentVariable
- 데이터베이스에서 읽을 세그먼트에 해당하는 DLISegment 변수의 이름입니다.
- forUpdate
- 나중에 파일 또는 데이터베이스에서 검색한 데이터에 대해 EGL replace 또는 delete 문을 사용하는 옵션입니다.
- forUpdate 옵션은 커미트가 발생할 때까지 다른 프로그램에서 변경하지 못하도록 레코드를 잠급니다. 커미트 처리에 대한 자세한 정보는 논리적 작업 단위의 내용을 참조하십시오.
- usingPCB pcbName
- 기본 PCB 대신 사용하도록 PSB 레코드에 정의된 PCB의 이름을 지정하는 옵션입니다.
- with #dli{ dliStatement }
- 명시적 DL/I GU 또는 GHU 문을 사용하는 옵션입니다. 자세한 정보는 #dli 지시문의 내용을 참조하십시오. #dli와 왼쪽 중괄호 사이에 공백을 두지 마십시오.
- DLIDynamicArray
- DLISegment 레코드로 구성되는 동적 배열의 이름입니다.
위치 옵션
get next 문은 DL/I GN문을 생성합니다. get next...forUpdate 문은 DL/I GHN 문을 생성합니다. 이 명령문은 계층 구조 순서에서 현재 세그먼트 바로 다음의 세그먼트를 읽습니다. 계층 구조 순서는 데이터베이스 관리자가 루트 세그먼트에서 시작하여 첫 번째 하위의 첫 번째 하위를 읽는 식으로 맨 아래에 도달할 때까지 읽어서 가능한 한 아래까지 계층 구조를 읽는 것을 의미합니다. 그런 다음 아직 읽지 않은 병렬 하위를 찾을 때까지 위로 이동하여 해당 세그먼트와 모든 하위 세그먼트를 읽습니다.
- 데이터베이스 관리자는 우선 루트 세그먼트(고객 이름 및 주소)를 읽습니다.
- 데이터베이스 관리자는 이 고객의 첫 번째 위치 세그먼트, 첫 번째 주문 세그먼트 및 해당 주문의 모든 품목 세그먼트를 읽습니다.
- 주문 세그먼트가 더 있는 경우 데이터베이스 관리자는 다음 주문 세그먼트와 해당 주문의 모든 품목 세그먼트를 읽습니다. 이 위치에 대한 주문 세그먼트가 더 없으면 4단계로 이동하십시오.
- 위치 세그먼트가 더 있는 경우 데이터베이스 관리자는 다음 위치 세그먼트, 해당 위치의 첫 번째 주문 세그먼트 및 해당 주문의 모든 품목 세그먼트를 읽습니다. 3단계로 돌아가십시오. 위치 세그먼트가 더 없으면 5단계로 이동하십시오.
- 고객 세그먼트가 더 있는 경우 데이터베이스 관리자는 다음 고객 세그먼트를 읽습니다. 2단계로 돌아가십시오. 고객 세그먼트가 더 없으면 관리자는 전체 파일을 읽은 것입니다.
또한 DL/I는 get next 문에서 경로 호출의 사용을 지원합니다. 이는 읽는 중인 최하위 레벨 세그먼트와 루트 사이의 모든 세그먼트 레벨에 대해 상위 세그먼트를 읽을 수 있음을 의미합니다.
// define DLI Segment records using the hostVarQualifier property
Record CustomerRecordPart type DLISegment
{ segmentName="STSCCST", keyItem="customerNo", hostVarQualifier="myCustomer" }
...
endRecord LocationRecordPart type DLISegment
{ segmentName="STSCLOC", keyItem="locationNo", hostVarQualifier="myLocation" }
...
endRecord OrderRecordPart type DLISegment
{ segmentName="STPCORD", keyItem="orderDateNo", hostVarQualifier="myOrder" }
...
end
//create variables for the records
myCustomer CustomerRecord;
myLocation LocationRecord;
myOrder OrderRecord;
//build a segment search argument
myCustomer.customerNo = "005001";
myLocation.locationNo = "000022";
myOrder.orderDateNo = "20050730A003";
set myOrder position;
//loop through the orders
while (myOrder not noRecordFound)
try
get next myOrder;
onException
myErrorHandler(2);
end // end try
end // end while
GU STSCCST (STQCCNO = :myCustomer.customerNo)
STSCLOC (STQCLNO = :myLocation.locationNo)
STPCORD (STQCODN = :myOrder.orderDateNo)
루프를 처음으로 통과한 후 EGL은 GN 호출을 사용합니다.
- set record position은 EGL이 DLISegment 레코드를 위한 첫 번째 get next 문을 get(GU 호출)으로 변환해야 함을 표시하는 플래그를 설정합니다.
- DLISegment 레코드를 위한 다음 I/O 문이 get next 문이 아닌 경우, set record position 문은 무시되고 플래그가 재설정됩니다.
- get next 문이 #dli 지시문을 지정하는 경우, set record position 문은 무시되고 플래그가 재설정됩니다.
DLISegment 레코드의 동적 배열을 get next 문의 오브젝트로 지정하는 경우 배열의 각 레코드에 대해 DL/I GN 호출을 생성합니다. 배열이 많은 요소를 지정하지 않는 경우, 이 명령문은 DL/I 데이터베이스의 끝 또는 오류 코드가 발생할 때까지 GN 호출을 생성합니다. 예측 가능한 추가 동작을 위해 이 상황에서 get next inParent 문을 사용하십시오.
get next inParent 문은 DL/I GNP 문(forUpdate 수정자가 없는 경우) 또는 GHNP(forUpdate 수정자가 있는 경우)를 생성합니다. 이 명령문은 현재 데이터베이스 위치에 있는 세그먼트와 상위가 동일한 다음 하위 세그먼트를 읽습니다. next inParent 수정자를 사용하여 DL/I 세그먼트 세트를 동적 배열로 검색할 수도 있습니다.
예제
emp.empnum = 1; // sets the key in record emp
try
get emp forUpdate;
onException(dex DLIException)
myErrorHandler(dex); // exits the program
end
emp.empname = emp.empname + " Smith";
try
replace emp;
onException(dex DLIException)
myErrorHandler(dex);
end
호환성
| 플랫폼 | 문제 |
|---|---|
| z/OS®용 CICS® | get 위치는 다음 상황에서 유실됩니다.
|