예를 들어, 애플리케이션은 구문적으로 동일하지만 양식 필드에서 사용자가 제공하는 리터럴 값을 포함하는 INSERT문을 생성할 수 있습니다.
보통, 명령문은 런타임 시 생성되므로 정적으로 명령문을 실행할 수 없습니다. 하지만 pureQuery 클라이언트 최적화는 리터럴 값을 매개변수 표시문자로 대체하고 SQL문의 구문이 이미 캡처된 명령문의 구문과 동일한 경우를 인식해서 이와 같은 명령문을 캡처할 수 있습니다. 따라서 이 SQL문을 DB2® 패키지에 바인드할 수 있습니다.
클라이언트 최적화 특성 executionMode가 STATIC으로 설정된 애플리케이션을 실행할 때 pureQuery는 캡처한 매개변수화된 SQL문에 SQL문을 일치시킬 수 있습니다. 일치하는 명령문은 정적으로 실행됩니다. 일치하는 명령문은 데이터베이스에서 실행됩니다.
애플리케이션이 SQL문을 동적으로 실행하는 경우 매개변수 표시문자로 대체된 리터럴로 캡처된 명령문을 실행하는 보안의 이점을 얻을 수 있습니다. pureQuery Runtime 특성 capturedOnly의 값을 TRUE로 설정하십시오.
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 패키지에 명령문을 바인드할 수 있습니다.
STATIC으로 설정된 executionMode 특성으로 애플리케이션을 실행하고 애플리케이션이 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 특성의 값과 SQL문을 캡처할 때의 효과를 나열합니다. 테이블은 또한 이 특성의 값을 설정하지 않을 경우 발생하는 사항도 보여줍니다.
값 | 처음 명령문을 캡처하는 경우의 효과 | 점차적으로 캡처하는 경우의 효과 | 애플리케이션을 STATIC 또는 DYNAMIC 모드에서 실행하는 경우의 효과 |
---|---|---|---|
ENABLE | pureQuery는 리터럴 값을 매개변수 표시문자로
교체합니다. pureQuery는 또한 원래 SQL문에 대한 스택 추적도 캡처합니다. pureQuery가 모든 원래 SQL문의 스택 추적을 캡처하게 하려면 maxStackTracesCaptured 특성의 값을 증가시켜야 할 수도 있습니다. 1 pureQuery는 maxNonParmSQL 특성의 값에 대해 원래 SQL문을 계산하지 않습니다. pureQuery가 SQL문을 매개변수화할 수 없고 로그 레벨이 FINE 또는 FINER인 경우 경고 메시지를 로깅합니다. 로그된 경고 메시지에 대한 정보는 SQL 리터럴 대체의 내용을 참조하십시오. |
효과는 SQL문을 처음 캡처하는 경우와 동일합니다. | pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일에 있는 매개변수화된 SQL문과 일치시키려고 합니다. 2 |
DISABLE | pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. | pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. | pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일에 있는 매개변수화된 SQL문과 일치시키지 않습니다. |
NOT_SET(또는 지정 안함) | pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. | pureQuery가 지정된
pureQueryXML 파일에서 명령문을 마지막으로 캡처할 때 값이 ENABLE인 경우,
pureQuery는 가능한 경우 리터럴 값을 매개변수 표시문자로 교체합니다. 값이 DISABLE 또는 NOT_SET인 경우, pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. |
pureQuery가 지정된
pureQueryXML 파일에서 명령문을 마지막으로 캡처할 때 값이 ENABLE인 경우,
pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일의
매개변수화된 SQL문과 일치시키려고 합니다. 값이 DISABLE or NOT_SET인 경우 pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일의 매개변수화된 SQL문과 일치시키지 않습니다. |
pureQueryXML 파일을 지정하지 않고 SQL문 리터럴 대체를 사용하는 경우 명령문을 실행하기 전에 pureQuery Runtime이 SQL문의 리터럴 값을 매개변수 표시문자로 대체합니다. SQL문을 캡처하고 pureQueryXML 파일을 작성할 필요가 없습니다. 명령문은 동적으로 실행되며 정적으로 실행할 필요가 없습니다. 그러나 capturedOnly 및 executionMode와 같은 pureQueryXML 파일이 필요한 기타 pureQuery Runtime 옵션을 사용할 수 없습니다.
버전 2.2.0.1에서부터는, pureQuery Runtime이 리터럴 값을 매개변수 표시문자로 대체할 때 두 가지 유형의 캐스팅을 지원합니다.
Cast 함수에서 매개변수의 SQL 리터럴 대체는 CLI 애플리케이션 환경에서 지원되지 않습니다.
예를 들어, 명령문에 WHERE mySMALLINTcolumn=CAST(99 as INTEGER), the value 99절이 포함되어 있는 경우 값 99는 명령문 캡처 시 매개변수 표시문자가 됩니다.
또 다른 예로, CAST(6 as DECIMAL(7,3)) CAST 함수를 사용하는 경우 6만 명령문 캡처 시 매개변수 표시문자가 됩니다.
이름이 CAST인 사용자 정의 외부 스칼라 함수는 지원되지 않습니다.
INSERT INTO DEPARTMENT VALUES(1,5,56,'000010','A00','aa','2008-09-09')
pureQuery Runtime은 기타 유형의 내재된 캐스팅을 수행하지 않습니다.
값에 대한 준비와 확인이 성공하는 경우, pureQuery Runtime은 매개변수화된 SQL문을 사용합니다. 테스트가 성공하지 않은 경우 propureQuery는 SQL의 원래 버전을 사용하고 명령문에 리터럴 대체가 수행되지 않은 이유에 대해 사용자에게 알리는 경고를 로그합니다. 그러한 첫 번째 연결 실패는 FINE 레벨로 로그됩니다. 후속 실패는 FINER로 로그됩니다.
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 특성을 구성 키워드로 사용할 수 있습니다.
pureQueryXML 파일을 지정하지 않고 SQL 리터럴 대체를 사용할 수 있습니다. SQL문을 캡처하고 pureQueryXML 파일을 작성할 필요가 없습니다. 명령문은 동적으로 실행되며 정적으로 실행할 필요가 없습니다.
<configuration> <dsncollection> <dsn alias="sample",name="sample",host="server1.test.com", port="50001"> <parameter name="sqlLiteralSubstitution", value="ENABLE"/> </dsn> </dsncollection> <databases> <database name="sample", host=" server1.test.com", port="50001"> </database> </databases> </configuration>pureQuery 클라이언트 최적화에 사용 가능한 CLI 애플리케이션의 경우 명령문을 동적으로 실행하려고 시도하기 전에 pureQuery Runtime이 SQL문의 리터럴 값을 매개변수 표시문자로 대체합니다.