SQL에 대한 replace 고려사항
SQL의 컨텍스트에서 EGL replace 문은 SQL 레코드 변수에서 개정된 정보를 다시 관계형 데이터베이스의 행에 넣습니다.
이 명령문은 생성된 코드에 SQL UPDATE 문을 작성합니다. EGL은 SQL 레코드 변수의 정보 및 특성을 기반으로 이 명령문을 암시적으로 생성할 수 있으며, 또는 사용자가 #sql 지시문을 사용하여 replace 문에 명시적 SQL 코드를 삽입할 수 있습니다(sql 지시문 참조).
replace 문을 사용하기 전에 후속 대체 행을 검색해야 합니다. 다음 두 가지 방법 중 하나를 사용하여 이를 수행할 수 있습니다.
- get 문(forUpdate 옵션 사용)을 사용하여 행을 검색합니다.
- open 문을 사용하여 행 세트를 선택한 후 get next 문을 사용하여 원하는 행을 검색합니다.
구문

- 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 문 또는 레코드를 지정해야 합니다. 유효성 검증은 동일한 명령문에 nocursor와 usingKeys를 지정하도록 허용하지 않습니다.
- usingKeys
- 여기에서 SQLRecordVariable의 필드 이름을 지정하여
레코드 정의에서 지정한 키 필드를 대체할 수 있습니다.
이 옵션은 위의 필드를 지정하여
SQL WHERE 절을 위한 조건을 제공합니다. 이러한 필드는 대체할 데이터베이스 행의 해당 열에 일치해야 합니다. 키 항목은
SET 절에서 업데이트되는 열 목록에서 제외됩니다. 참고: 복수 행 조작의 경우 EGL은 usingKeys를 지원하지 않습니다.
- from resultSetID
- 다음 조건이 참인 경우, 이전 EGL get 또는 open 문의 결과 세트 ID를 지정해야 합니다.
- 임베디드 SQL문(#sql 지시문 사용)을 사용하여 결과 세트를 작성했습니다.
- 해당 코드는 업데이트를 위해 EGL이 생성한 암시적 SQL과 다른 열 세트를 검색했습니다.
암시적 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 레코드 변수를 지정합니다.
호환성
| 플랫폼 | 문제 |
|---|---|
| COBOL 생성 | COBOL에서 최고의 성능을 위해 replace 문에 항상 from resultSet 절을 포함시키십시오. |
| SQL Server | 복수 행 delete last와 get last는 함께 사용될 수 없습니다. 두 명령문이 한 번에 실행되는 경우 결과 세트가 닫힙니다. |
| i5/OS™용 DB2® | 저널링이 사용되거나 연결 문자열에 transation isolation=none을 추가해야 합니다. |