SQL에 대한 replace 고려사항

SQL의 컨텍스트에서 EGL replace 문은 SQL 레코드 변수에서 개정된 정보를 다시 관계형 데이터베이스의 행에 넣습니다.

이 명령문은 생성된 코드에 SQL UPDATE 문을 작성합니다. EGL은 SQL 레코드 변수의 정보 및 특성을 기반으로 이 명령문을 암시적으로 생성할 수 있으며, 또는 사용자가 #sql 지시문을 사용하여 replace 문에 명시적 SQL 코드를 삽입할 수 있습니다(sql 지시문 참조).

replace 문을 사용하기 전에 후속 대체 행을 검색해야 합니다. 다음 두 가지 방법 중 하나를 사용하여 이를 수행할 수 있습니다.
  • get 문(forUpdate 옵션 사용)을 사용하여 행을 검색합니다.
  • open 문을 사용하여 행 세트를 선택한 후 get next 문을 사용하여 원하는 행을 검색합니다.

구문

replace 문의 구문 다이어그램
SQLRecordVariable
업데이트된 정보를 배치한 스토리지 영역을 참조합니다. EGL은 이 정보를 사용하여 단일 데이터베이스 행을 업데이트합니다.
SQLDynamicArray
이 변수는 SQL 레코드 변수로 구성된 동적 배열의 이름을 지정합니다. EGL replace는 전체 DymicArray를 업데이트합니다. replace 문은 with #sql{ExplicitCode}를 사용해야 합니다. 커서 위치는 open 또는 get position 문을 사용하여 설정되어야 합니다.
SQLDynamicArrayElement
동적 배열의 요소를 지정할 수 있습니다. EGL replace 는 동적 배열에서 지정된 행을 업데이트합니다. 커서 위치는 open 또는 get position 문을 사용하여 설정되어야 합니다.
sqlStatement
그밖의 경우 EGL이 생성하는 암시적 SQL UPDATE 문을 대체하는 임베드된 SQL UPDATE 문입니다. #sql과 왼쪽 중괄호 사이에 공백을 남기지 마십시오.
replaceOptions
EGL이 암시적 SQL 코드를 사용하도록 하려면 다음과 같은 옵션을 사용하여 출력을 도울 수 있습니다.
cursor
이 옵션은 EGL에게 WHERE CURRENT OF cursorID 절을 작성하도록 알립니다. 이 경우 EGL은 해당 명령이 작성하는 커서에 대한 직접 액세스를 제공하지 않으므로 get 또는 open 문을 사용하여 결과 세트를 작성했어야 합니다. EGL은 SQL 레코드 변수 이름을 사용하여 이 cursorID를 찾습니다. 이 옵션은 기본값입니다.
nocursor
이 옵션은 표준 WHERE 절을 생성합니다. 또한 keyItems 특성을 포함하는 명시적 SQL 문 또는 레코드를 지정해야 합니다. 유효성 검증은 동일한 명령문에 nocursorusingKeys를 지정하도록 허용하지 않습니다.
usingKeys
여기에서 SQLRecordVariable의 필드 이름을 지정하여 레코드 정의에서 지정한 키 필드를 대체할 수 있습니다. 이 옵션은 위의 필드를 지정하여 SQL WHERE 절을 위한 조건을 제공합니다. 이러한 필드는 대체할 데이터베이스 행의 해당 열에 일치해야 합니다. 키 항목은 SET 절에서 업데이트되는 열 목록에서 제외됩니다.
참고: 복수 행 조작의 경우 EGL은 usingKeys를 지원하지 않습니다.
from resultSetID
다음 조건이 참인 경우, 이전 EGL get 또는 open 문의 결과 세트 ID를 지정해야 합니다.
  • 임베디드 SQL문(#sql 지시문 사용)을 사용하여 결과 세트를 작성했습니다.
  • 해당 코드는 업데이트를 위해 EGL이 생성한 암시적 SQL과 다른 열 세트를 검색했습니다.
즉, EGL이 이 SQL 레코드 변수에 대해 정상적으로 작성하는 기본 결과 세트에 대해 작업하지 않는 경우에는 결과 세트 ID를 지정하십시오.

암시적 SQL문

기본적으로 SQL 레코드를 쓰는 replace 문은 다음과 같은 영향이 있습니다.
  • 레코드 파트 선언에서 레코드 필드와 Record 테이블 열을 연관시키면 생성된 코드는 레코드 변수의 각 필드에 있는 데이터를 관련된 SQL 테이블 열에 복사합니다.
  • 필드를 키 항목 또는 읽기 전용으로 정의한 경우, 이 필드에 해당하는 열의 값은 영향을 받지 않습니다.
SQL문에는 기본적으로 다음과 같은 특성이 있습니다.
  • 암시적 SQL UPDATE 문에는 키 항목 또는 읽기 전용으로 정의된 필드가 포함되지 않습니다.
  • 특정 레코드를 위한 암시적 SQL UPDATE 문은 다음과 유사합니다.
    UPDATE tableName
    SET    column01 = :myField01,
           column02 = :myField02,
            ...
           columnNN = :myFieldNN    
    WHERE CURRENT OF cursor

예제

다음 코드는 replace 문을 포함합니다. 이 코드는 샘플 EGL SQL 프로그램에서 찾을 수 있는 전체 SQL 프로그램의 일부입니다.

  try
    get dept forupdate;
    dept.description = "Test Engineers";
    replace dept;
    commit();
  onException(sqlEx SQLException)
    sqlFailure();     
  end 

다음 예제는 복수 행을 위한 replace 문을 표시합니다.

employees Employee[0]{rowsetsize=10};
Open resultset1 forUpdate with #sql{ 
    select eID, uName, PASSWORD, fName, lName, office, sex, EMail
    from EMPLOYEETEST
} for employees;
Get Next employees;

//this updates the second row in the row set with current contents
employees[2].uName = “test”;
Replace employees[2]; 

// this updates the second row in the row set with explicit variable
newName CHAR(20) = “test1”;
Replace employees[2]
         #with SQL{ update EMPLOYEETEST 
                    set uName = :newName }; 

// the index can be a variable
i int = 2;
Replace employees[i]; 

//this updates all rows in the row set with uName = "test"
//Explicit SQL must be used, otherwise there should be a 
//validation error. 
uName CHAR(10) = “test”;
Replace employees 
        #with SQL{ update EMPLOYEETEST  
                   set uName = :uName };

오류 조건

다음은 replace 문을 사용할 때 올바르지 않은 조건입니다.
  • #sql 지시문을 사용하여 UPDATE가 아닌 유형의 SQL문을 임베드하는 경우
  • 임베디드 코드에서 SQL UPDATE 문의 일부 절을 지정하지만 모든 절을 지정하지는 않은 경우
  • 기본 결과 세트에 대해 작업 중이 아닐 때 결과 세트 ID를 지정하지 않는 경우. 자세한 정보는 이 주제의 "구문"을 참조하십시오.
  • 다음 특성 중 하나가 있는 임베디드 UPDATE 문을 지정(또는 암시적 UPDATE 문을 승인)하는 경우
    • 복수 테이블을 업데이트합니다.
    • 존재하지 않는 열 또는 관련된 호스트 변수와 호환되지 않는 열과 연관되었습니다.
  • 모든 필드가 읽기 전용인 SQL 레코드 변수를 지정합니다.

호환성

표 1. replace에 대한 호환성 고려사항
플랫폼 문제
COBOL 생성 COBOL에서 최고의 성능을 위해 replace 문에 항상 from resultSet 절을 포함시키십시오.
SQL Server 복수 행 delete lastget last는 함께 사용될 수 없습니다. 두 명령문이 한 번에 실행되는 경우 결과 세트가 닫힙니다.
i5/OS™용 DB2® 저널링이 사용되거나 연결 문자열에 transation isolation=none을 추가해야 합니다.