예를 들어, 애플리케이션은 구문적으로 동일하지만 양식 필드에서 사용자가 제공하는 리터럴 값을 포함하는 INSERT문을 생성할 수 있습니다.
보통, 명령문은 런타임 시 생성되므로 정적으로 명령문을 실행할 수 없습니다. 하지만 pureQuery 클라이언트 최적화는 리터럴 값을 매개변수 표시문자로 대체하고 SQL문의 구문이 이미 캡처된 명령문의 구문과 동일한 경우를 인식해서 이와 같은 명령문을 캡처할 수 있습니다. 따라서 이 SQL문을 DB2® 패키지에 바인드할 수 있습니다.
클라이언트 최적화 특성 executionMode가 STATIC으로 설정된 애플리케이션을 실행할 때 pureQuery는 캡처한 매개변수화된 SQL문에 SQL문을 일치시킬 수 있습니다. 일치하는 명령문은 정적으로 실행됩니다.
SQL문을 캡처하기 전에 클라이언트 최적화 특성을 설정할 때 다음 예와 같이 특성 sqlLiteralSubstitution을 ENABLE로 설정하십시오.
pdqProperties=captureMode (ON), executionMode (DYNAMIC), pureQueryXml (C:/workspace/capture_file.pdqxml), sqlLiteralSubstitution (ENABLE)
애플리케이션이 다음 예의 첫 번째 명령문과 유사한 INSERT문을 실행하는 경우, pureQuery는 두 번째 명령문의 양식으로 이 명령문을 캡처합니다.
insert into EMPLOYEES/*inserting new row into EMPLOYEES table*/values('Dong','Margaret',NULL,60000,12) insert into EMPLOYEES values(?,?,?,?,?)
명령문 캡처를 완료하면, capture_file.pdqxml에 대해 Configure 유틸리티를 실행한 후 StaticBinder 유틸리티를 실행하여 명령문을 DB2 패키지에 바인드할 수 있습니다.
executionMode가 STATIC으로 설정된 애플리케이션을 실행하며 애플리케이션이 insert into EMPLOYEES values('Hinkis','Tali','R',68000,20)) 명령문을 발행하는 경우, pureQuery는 명령문을 pureQueryXML 파일의 매개변수화된 버전에 일치시켜서 정적으로 실행합니다.
그러나 capture_file.pdqxml에 있는 매개변수화된 명령문과는 SQL문을 일치시키지 않도록 pureQuery에 지시할 수 있습니다. 애플리케이션을 실행하기 전에, executionMode를 STATIC으로 설정할 때 sqlLiteralSubstitution을 DISABLE로 설정할 수도 있습니다. 사용자가 애플리케이션을 실행하고 애플리케이션이 이전 단락에서 INSERT문을 발행하는 경우, pureQuery의 명령문 실행 여부는 capturedOnly 및 allowDynamicSQL 클라이언트 최적화 특성의 값에 따라 결정됩니다.
다음 테이블은 sqlLiteralSubstitution 특성의 값과 효과를 나열합니다. 테이블은 또한 이 특성의 값을 설정하지 않을 경우 발생하는 사항도 보여줍니다.
값 | 처음 명령문을 캡처하는 경우의 효과 | 점차적으로 캡처하는 경우의 효과 | 애플리케이션을 STATIC 또는 DYNAMIC 모드에서 실행하는 경우의 효과 |
---|---|---|---|
ENABLE | pureQuery는 리터럴 값을 매개변수 표시문자로
교체합니다. pureQuery는 또한 원래 SQL문에 대한 스택 추적도 캡처합니다. pureQuery가 모든 원래 SQL문의 스택 추적을 캡처하게 하려면 maxStackTracesCaptured 특성의 값을 증가시켜야 할 수도 있습니다. 1 pureQuery는 maxNonParmSQL 특성의 값에 대해 원래 SQL문을 계산하지 않습니다. pureQuery가 SQL문을 매개변수화할 수 없는 경우 경고 메시지를 로깅합니다. |
효과는 SQL문을 처음 캡처하는 경우와 동일합니다. | pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일에 있는 매개변수화된 SQL문과 일치시키려고 합니다. |
DISABLE | pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. | pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. | pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일에 있는 매개변수화된 SQL문과 일치시키지 않습니다. |
NOT_SET(또는 지정 안함) | pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. | pureQuery가 지정된
pureQueryXML 파일에서 명령문을 마지막으로 캡처할 때 값이 ENABLE인 경우,
pureQuery는 리터럴 값을 매개변수 표시문자로 교체합니다. 값이 DISABLE인 경우, pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. |
pureQuery가 지정된
pureQueryXML 파일에서 명령문을 마지막으로 캡처할 때 값이 ENABLE인 경우,
pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일의
매개변수화된 SQL문과 일치시키려고 합니다. 값이 DISABLE인 경우 pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일의 매개변수화된 SQL문과 일치시키지 않습니다. |
버전 2.2.0.1에서부터는, pureQuery Runtime이 리터럴 값을 매개변수 표시문자로 대체할 때 두 가지 유형의 캐스팅을 지원합니다.
CAST() 함수에 대한 sqlLiteralSubstitution 지원이 CLI 애플리케이션 환경에서는 사용 불가능합니다.
예를 들어, 명령문에 WHERE mySMALLINTcolumn=CAST(32767999 as INTEGER) 절이 있는 경우 값 32767999는 명령문 캡처 시 매개변수 표시문자가 됩니다.
또 다른 예로, CAST(6 as DECIMAL(3,3)) CAST 함수를 사용하는 경우 6만 명령문 캡처 시 매개변수 표시문자가 됩니다.
이름이 CAST인 사용자 정의 외부 스칼라 함수는 지원되지 않습니다.
데이터베이스 클라이언트에 대해 변환이 발생할 수 있으므로, 내재된 캐스팅을 지원하지 않은 데이터베이스 관리 시스템에 대해 이와 같은 SQL문을 실행할 수 있습니다.
pureQuery는 다음 유형의 내재된 캐스팅을 지원합니다.
select DEPTNAME from DEPARTMENT WHERE DEPTNO = '1' select DEPTNAME from DEPARTMENT WHERE DEPTNO BETWEEN '20' AND '30'
select DEPTNO from DEPARTMENT WHERE DEPTNAME = 123456
INSERT INTO DEPARTMENT VALUES(1,5,56,'000010','A00','aa','2008-09-09')
insert into sales values (5, ?, 9);
DATE( CAST( ? AS VARCHAR(255) ) )
INSERT문에 사용될 때 DATE() 함수의 리터럴은 매개변수 표시문자로 대체되지 않습니다.
WHERE datecol = DATE '2001-01-01'
DB2 CLI(Call Level Interface) 또는 IBM® Data Server Driver를 pureQuery 런타임에 사용하는 경우 pureQuery Runtime 특성을 구성 키워드로 사용할 수 있습니다.