SQL에 대한 prepare 고려사항

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

구문

prepare 문의 구문 다이어그램
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;
다음 예제에서처럼 prepare 문을 실행한 후 I/O 오류값에 대해 레코드 이름을 테스트하여 명령문이 성공했는지 여부를 판별하십시오. 이 예제는 호스트 변수를 위한 플레이스홀더로 물음표를 사용합니다(호스트 변수 참조).
  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 문에는 WHERE CURRENT OF resultSetIdentifier 형식의 구문이 포함될 수 있습니다. 이 기술은 다음 조건이 참인 경우에만 유효합니다.
  • 구문이 리터럴로 코딩되었습니다.
  • prepare 문이 실행될 때 결과 세트가 열려 있습니다.
X1이 open 문의 결과 세트 ID라고 가정할 때 다음 예제는 준비된 동적 명령문을 빌드하고 실행합니다.
	 prepare prep02 from
    "update myTable " ::
    "set empname = ?,  empphone = ?  where current of x1" ;
 
  execute prep02 using empname, empphone;
  freeSQL prep02;

호환성

표 1. prepare에 대한 호환성 고려사항
플랫폼 문제
COBOL 생성 및 디버그 동적 SQL 준비된 명령문에서는 참조하고 사용하는 함수와 동일한 함수에 모든 ID 및 SQLRecord 변수를 선언해야 합니다. 이 제한사항은 Java™ 생성에는 적용되지 않습니다. Java 생성에서는 ID가 네임스페이스 내의 임의 위치에 있을 수 있습니다.
Java 생성 문자열을 준비할 문자열 표현식이 유효하지 않은 경우 prepare 문이 실패하지 않을 수 있습니다. 대신 EGL이 준비된 명령문을 처음 사용할 때 SQLException을 처리할 수 있습니다.
Oracle에서 JDBC 드라이버를 사용하여 다음과 같이 구조화된 코드를 처리하는 경우 문제가 발생할 수 있습니다.
   prepare q from "select a, b from c where myColumn > ?";
   get into x, y with q using myVar;

문제는 해당 행이 검색되려면 변수 길이를 데이터베이스 열의 길이와 동일하게 설정해야 한다는 점입니다.

다음과 같은 경우 행이 검색되지 않습니다.
  • prepare 문에 WHERE 절이 있는 SQL SELECT 문이 포함됩니다.
  • WHERE 절이 SQL 유형 CHAR의 열을 호스트 변수와 비교합니다.
  • 준비된 명령문을 실행하는 명령문에서 호스트 변수가 EGL 유형 CHAR입니다.
  • 데이터베이스 열의 길이가 변수의 길이와 다릅니다.
  • Oracle에서 JDBC 드라이버를 사용 중입니다.

여기에서 문제는 다음 웹 사이트의 11.3.7.4 섹션에서 설명합니다. http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/datacc.htm.