SQL에 대한 prepare 고려사항
EGL prepare 문은 SQL PREPARE 문을 생성하고 런타임 시에만 알려지는 세부사항을 포함하는 옵션을 사용자에게 제공합니다. 준비된 SQL 코드를 EGL execute 문과 함께 실행하거나 SQL 코드가 결과 세트를 리턴하는 경우 open 또는 get 문과 함께 실행하십시오.
구문

- preparedStatementID
- 런타임 시 prepare 문이 작성하는 SQL 코드를 식별하기 위해 사용자가 선택한 문자열입니다. 그런 다음 이 ID를 EGL execute, open 또는 get 문에 사용할 수 있습니다.
- stringExpression
- 문자열 표현식 형식의 올바른 SQL문입니다. 따옴표로 리터럴 문자열을 표시하고 "::" 연산자를 사용하여 문자열 변수로 결합하십시오(이 주제의 "예제" 참조).
- SQLRecordVariable
- SQL 레코드 변수의 이름입니다. EGL 편집기는 stringExpression을 빌드하기 위한 큐를 제공할 수 있습니다(EGL 프로그래머 안내서에서 컨텐츠 지원의 내용을 참조하십시오.) 이 이름에서 오류 조건을 테스트할 수 있습니다(이 주제의 "예제" 참조).
동적 SQL 및 prepare 문
prepare 문은 동적 SQL 처리를 수행하는 일반적인 방법입니다. 사용자가 지정하는 문자열 표현식에는 런타임에만 값을 알 수 있는 변수가 포함되어 프로그램에 강력한 옵션을 제공할 수 있습니다.
동적 SQL을 위한 공통 사용은 사용자 제어 조회입니다. 예를 들어, 사용자는 선택란을 선택하여 보고서에 정보를 포함시킬 수 있습니다. 또한 WHERE 절을 사용하여 프로그램이 표시할 고객 레코드를 결정할 수도 있습니다. 두 경우 모두에 사용자가 선택하는 데이터를 미리 알지 못합니다.
또한 문자열 표현식에서 호스트 변수를 위한 플레이스홀더로 물음표를 사용할 수도 있습니다(호스트 변수 참조). 준비된 명령문을 실행하면 해당 변수가 prepare, get 또는 open 문에서 using 절의 파트로 나열됩니다. 두 번째 예제는 이 프로세스를 나타냅니다. 모든 플레이스홀더 물음표에 대해 호스트 변수를 제공해야 하며, 또한 이러한 변수가 무엇을 위해 사용되는지도 알고 있어야 합니다.
예제
query STRING;
fieldName STRING;
isFirstField BOOLEAN;
query = "SELECT ";
isFirstField = true;
// function supplies field names selected by user
// returns -1 when all are used
while ((nextFieldName(fieldName)) == 0) // sets fieldName
if (!isFirstField) // more than one field in SELECT
query ::= ", ";
end query ::= fieldName;
isFirstField = false;
end // of while
// finish up query
query ::= "FROM Customer WHERE customer_number = ?";
prepare myPreparedStatement from query;
try
prepare prep01 from
"INSERT INTO " :: aTableName ::
"(customer_number, customer_name) " ::
"VALUE ?, ?"
for myCustomer;
onException(sqlEx SQLException)
if (myCustomer is unique)
myErrorHandler(8);
else
myErrorHandler(sqlEx);
end end
try
execute myStatement
using myRecord.empnum,
myRecord.empname;
onException(sqlEx SQLException)
myErrorHandler(sqlEx);
end
위의 예제에 나타낸 것처럼 호스트 변수의 자리에 물음표(?)를 사용할 수 있습니다. 런타임에 사용되는 호스트 변수의 이름은 준비된 명령문을 실행하는 execute, open 또는 get 문의 using 절에 배치됩니다.
- 구문이 리터럴로 코딩되었습니다.
- prepare 문이 실행될 때 결과 세트가 열려 있습니다.
prepare prep02 from
"update myTable " ::
"set empname = ?, empphone = ? where current of x1" ;
execute prep02 using empname, empphone;
freeSQL prep02;
호환성
| 플랫폼 | 문제 |
|---|---|
| COBOL 생성 및 디버그 | 동적 SQL 준비된 명령문에서는 참조하고 사용하는 함수와 동일한 함수에 모든 ID 및 SQLRecord 변수를 선언해야 합니다. 이 제한사항은 Java™ 생성에는 적용되지 않습니다. Java 생성에서는 ID가 네임스페이스 내의 임의 위치에 있을 수 있습니다. |
| Java 생성 | 문자열을 준비할 문자열 표현식이 유효하지 않은 경우
prepare 문이 실패하지 않을 수 있습니다. 대신 EGL이 준비된 명령문을 처음 사용할 때
SQLException을 처리할 수 있습니다. Oracle에서 JDBC 드라이버를 사용하여
다음과 같이 구조화된 코드를 처리하는 경우 문제가 발생할 수 있습니다.
문제는 해당 행이 검색되려면 변수 길이를 데이터베이스 열의 길이와 동일하게 설정해야 한다는 점입니다. 다음과 같은 경우 행이 검색되지 않습니다.
여기에서 문제는 다음 웹 사이트의 11.3.7.4 섹션에서 설명합니다. http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/datacc.htm. |