DL/I에 대한 get 고려사항

DL/I의 컨텍스트에서 EGL get 문은 DL/I 데이터베이스에서 단일 세그먼트를 검색합니다.

이 명령문에는 나중에 코드에서 저장된 데이터를 대체하거나 삭제하는 데 사용할 수 있는 forUpdate 옵션이 있습니다. 또한 이 명령문을 사용하여 DL/I 세그먼트 세트를 검색하고 각 연속 세그먼트의 컨텐츠를 동적 배열의 다음 DLISegment 레코드에 배치할 수도 있습니다.

get 문은 DL/I GU(get unique) 문을 생성합니다. get...forUpdate 문은 DL/I GHU 문을 생성합니다.

get 문에는 다음과 같은 프린시펄 사용이 있습니다.
  • 세그먼트의 데이터로 보고서 또는 송장 인쇄와 같은 작업을 수행하기 위해 세그먼트를 읽습니다.
  • EGL 키워드 delete 또는 replace를 사용하여 세그먼트를 제거하거나 업데이트하기 위해 세그먼트를 보유합니다(forUpdate 옵션과 결합). 대부분의 경우, 레코드를 add하기 전에 get 문을 수행할 필요가 없습니다.

DL/I에 대해 get...forUpdate 문을 사용하는 예제는 DL/I에 대한 delete 고려사항의 내용을 참조하십시오.

또한 DL/I는 get 문에서 경로 호출의 사용을 지원합니다. 경로 호출을 사용하는 경우, 읽는 중인 최하위 레벨 세그먼트와 루트 사이의 모든 세그먼트 레벨에 대해 상위 세그먼트를 읽을 수 있습니다. 다음 예제에서 EGL은 단일 호출을 사용하여 세 개의 DL/I 세그먼트 모두(고객, 위치 및 주문)를 각 DLISegment 레코드로 읽습니다.
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 호출을 생성합니다.

구문

DL/I get 고려사항의 구문 다이어그램
positionOption
nextnext 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 문을 생성합니다. 이 명령문은 계층 구조 순서에서 현재 세그먼트 바로 다음의 세그먼트를 읽습니다. 계층 구조 순서는 데이터베이스 관리자가 루트 세그먼트에서 시작하여 첫 번째 하위의 첫 번째 하위를 읽는 식으로 맨 아래에 도달할 때까지 읽어서 가능한 한 아래까지 계층 구조를 읽는 것을 의미합니다. 그런 다음 아직 읽지 않은 병렬 하위를 찾을 때까지 위로 이동하여 해당 세그먼트와 모든 하위 세그먼트를 읽습니다.

예를 들어, 예제 DL/I 데이터베이스에서 고객 데이터베이스에는 다음과 같은 계층 구조 순서가 있습니다.
  1. 데이터베이스 관리자는 우선 루트 세그먼트(고객 이름 및 주소)를 읽습니다.
  2. 데이터베이스 관리자는 이 고객의 첫 번째 위치 세그먼트, 첫 번째 주문 세그먼트 및 해당 주문의 모든 품목 세그먼트를 읽습니다.
  3. 주문 세그먼트가 더 있는 경우 데이터베이스 관리자는 다음 주문 세그먼트와 해당 주문의 모든 품목 세그먼트를 읽습니다. 이 위치에 대한 주문 세그먼트가 더 없으면 4단계로 이동하십시오.
  4. 위치 세그먼트가 더 있는 경우 데이터베이스 관리자는 다음 위치 세그먼트, 해당 위치의 첫 번째 주문 세그먼트 및 해당 주문의 모든 품목 세그먼트를 읽습니다. 3단계로 돌아가십시오. 위치 세그먼트가 더 없으면 5단계로 이동하십시오.
  5. 고객 세그먼트가 더 있는 경우 데이터베이스 관리자는 다음 고객 세그먼트를 읽습니다. 2단계로 돌아가십시오. 고객 세그먼트가 더 없으면 관리자는 전체 파일을 읽은 것입니다.

또한 DL/I는 get next 문에서 경로 호출의 사용을 지원합니다. 이는 읽는 중인 최하위 레벨 세그먼트와 루트 사이의 모든 세그먼트 레벨에 대해 상위 세그먼트를 읽을 수 있음을 의미합니다.

현재 데이터베이스 위치는 로컬 COBOL 또는 PL/I 프로그램을 작성할 때처럼 I/O 조작의 영향을 받습니다. 또한 EGL set record position 문을 사용하여 EGL이 후속 get next 문(GN 호출)을 get 문(GU 호출)으로 변경하도록 할 수 있습니다. 다음 예제를 고려하십시오.
// 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
get next 문이 처음 실행될 때 EGL은 다음과 같이 고객, 위치 및 주문에 대해 규정된 SSA와 함께 GU 호출을 사용합니다.
GU STSCCST (STQCCNO = :myCustomer.customerNo) 
   STSCLOC (STQCLNO = :myLocation.locationNo) 
   STPCORD (STQCODN = :myOrder.orderDateNo)

루프를 처음으로 통과한 후 EGL은 GN 호출을 사용합니다.

다음 고려사항은 set record position 문을 사용할 때 적용됩니다.
  • 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

호환성

표 1. get 및 DL/I에 대한 호환성 고려사항
플랫폼 문제
z/OS®용 CICS® get 위치는 다음 상황에서 유실됩니다.
  • 커미트 또는 롤백이 실행될 때
  • converse 문 다음에(세그먼트화 모드에서 실행 중인 경우)