EVAL문

EVAL문은 문자 값을 취하여 SQL문으로 해석하고 실행합니다.

EVAL 함수(여기서도 설명됨)는 문자 값을 사용하지만 값을 리턴하는 ESQL 표현식으로 해석합니다.

주: EVAL문 또는 EVAL 함수 내에서는 사용자 정의 함수 및 프로시저를 정의할 수 없습니다.

구문

EVAL은 표현식의 형식으로 하나의 매개변수를 취하고 이 표현식을 평가하고 결과 값이 아직 1이 아닌 경우 문자열로 캐스트합니다. 따라서 EVAL에 전달된 표현식은 문자열로 표현할 수 있어야 합니다.

이 첫 번째 단계 평가가 완료된 후에 EVAL의 작동은 완전한 ESQL문으로 사용되고 있는지 아니면 ESQL문의 일부분을 이루고 있는 표현식 대신 사용되고 있는지에 따라 다릅니다.
  • 완전한 ESQL문인 경우 첫 번째 단계 평가에서 도출된 문자열은 ESQL문인 것처럼 실행됩니다.
  • ESQL문의 일부를 이루고 있는 표현식인 경우 문자열은 ESQL 표현식인 것처럼 평가되며 EVAL은 결과를 리턴합니다.

다음의 예에서 A와 B는 정수 스칼라 변수이며 scalarVar1과 OperatorAsString은 문자열 스칼라 변수입니다.

다음의 예는 EVAL의 올바른 사용 예입니다.
  • SET OutputRoot.XML.Data.Result = EVAL(A+B);

    표현식 A+B는 정수 값을 리턴해도 정수 값은 문자열로 표현할 수 있으므로 EVAL이 평가의 두 번째 단계를 계속하기 전에 필요한 캐스트가 수행되기 때문에 승인할 수 있습니다.

  • SET OutputRoot.XML.Data.Result = EVAL('A' || operatorAsString || 'B');
  • EVAL('SET ' || scalarVar1 || ' = 2;');

    EVAL이 ESQL문 대신 사용되고 있는 경우 첫 번째 단계 평가는 종료 세미콜론을 포함하여 올바른 ESQL문을 나타내는 문자열을 리턴하게 되므로 마지막 문자열 리터럴의 끝에 포함된 세미콜론이 필요합니다.

EVAL문 내에서 선언된 변수는 이 EVAL문 외부에 존재하지 않습니다. 이런 측면에서 EVAL은 함수와 비슷하여 로컬로 선언된 변수는 로컬일 뿐이며 함수가 종료될 때 범위에서 벗어납니다.

EVAL의 실제 힘은 ESQL문이나 표현식을 동적으로 구성할 수 있도록 한다는 것입니다. 위의 두 번째 및 세 번째 예에서 scalarVar1 또는 operatorAsString은 수신되는 메시지 필드의 값이나 다른 동적 값에 따라 설정할 수 있으므로 잠재적으로 길이가 긴 IF THEN 방법을 요구하지 않고 실행되는 ESQL을 효과적으로 제어할 수 있습니다.

그러나 EVAL을 사용할 때 성능 영향을 고려해야 합니다. 명령문 또는 표현식의 동적 구성 및 실행은 간단하게 사전 구성된 것을 실행하는 것보다 분명히 시간 소모적입니다. 성능이 중요한 경우 보다 특정하지만 보다 빠른 ESQL을 작성하는 것보다 나음을 알 수 있을 것입니다.

다음은 올바르지 않은 EVAL 사용의 예입니다.
  • SET EVAL(scalarVar1) = 2;

    이 예에서 EVAL은 표현식이 아닌 필드 참조를 바꾸는 데 사용됩니다.

  • SET OutputRoot.XML.Data.Result[] = EVAL((SELECT T.x FROM Database.y AS T));

    이 예에서 EVAL로 전달된 (SELECT T.x FROM Database.y)는 문자열로 표현할 수 없는 목록을 리턴합니다.

(SELECT T.x FROM Database.y AS T)는 표현식 자체가 아닌 문자열 리터럴이므로 문자열로 표현할 수 있기 때문에 다음의 예를 승인할 수 있습니다.
SET OutputRoot.XML.Data.Result[]
  = EVAL('(SELECT T.x FROM Database.y AS T)');
관련 개념
ESQL 개요
관련 태스크
ESQL 개발
관련 참조
구문 다이어그램: 사용 가능한 유형
ESQL문
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
ak05020_