sqlLiteralSubstitution 등록 정보

응용프로그램이 같은 구문을 공유하고 포함되어 있는 리터럴 값만 다른 여러 SQL문을 실행하는 경우 pureQuery가 리터럴 값에 대한 매개변수 표시문자를 대체하게 하여 해당 명령문을 캡처하고 통합할 수 있습니다. 그러면 사용자 응용프로그램이 이 SQL문을 정적으로 실행하여 정적 SQL의 보안 및 속도 이점을 얻을 수 있습니다.

예를 들어, 응용프로그램은 구문적으로 동일하지만 양식 필드에서 사용자가 제공하는 리터럴 값을 포함하는 INSERT문을 생성할 수 있습니다.

보통, 명령문은 런타임 시 생성되므로 정적으로 명령문을 실행할 수 없습니다. 하지만 pureQuery 클라이언트 최적화는 리터럴 값을 매개변수 표시문자로 대체하고 SQL문의 구문이 이미 캡처된 명령문의 구문과 동일한 경우를 인식해서 이와 같은 명령문을 캡처할 수 있습니다. 따라서 이 SQL문을 DB2® 패키지에 바인드할 수 있습니다.

클라이언트 최적화 등록 정보 executionModeSTATIC으로 설정된 응용프로그램을 실행할 때 pureQuery는 캡처한 매개변수화된 SQL문에 SQL문을 일치시킬 수 있습니다. 일치하는 명령문은 정적으로 실행됩니다.

이 주제의 섹션

예제

SQL문을 캡처하기 전에 클라이언트 최적화 등록 정보를 설정할 때 다음 예와 같이 등록 정보 sqlLiteralSubstitutionENABLE로 설정하십시오.

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(?,?,?,?,?)
주: CLI 응용프로그램 환경에서는 NULL이 매개변수 표시문자로 대체되지 않으며 SQL문 내의 주석이 제거되지 않습니다.

명령문 캡처를 완료하면, 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 등록 정보의 값 설정

다음 테이블은 sqlLiteralSubstitution 등록 정보의 값과 효과를 나열합니다. 테이블은 또한 이 등록 정보의 값을 설정하지 않을 경우 발생하는 사항도 보여줍니다.

표 1. 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문과 일치시키지 않습니다.
주:
  1. maxStackTracesCaptured 등록 정보 및 스택 추적은 CLI 응용프로그램 환경에서 지원되지 않습니다.

캐스팅

버전 2.2.0.1에서부터는, pureQuery Runtime이 리터럴 값을 매개변수 표시문자로 대체할 때 두 가지 유형의 캐스팅을 지원합니다.

CAST() 함수에 대한 sqlLiteralSubstitution 지원이 CLI 응용프로그램 환경에서는 사용 불가능합니다.

CAST 함수
SQL문이 CAST 함수를 사용하여 리터럴 값을 데이터 유형에 캐스트하는 경우 pureQuery는 해당 값을 매개변수 표시문자로 대체합니다.

예를 들어, 명령문에 WHERE mySMALLINTcolumn=CAST(32767999 as INTEGER) 절이 있는 경우 값 32767999는 명령문 캡처 시 매개변수 표시문자가 됩니다.

또 다른 예로, CAST(6 as DECIMAL(3,3)) CAST 함수를 사용하는 경우 6만 명령문 캡처 시 매개변수 표시문자가 됩니다.

이름이 CAST인 사용자 정의 외부 스칼라 함수는 지원되지 않습니다.

내재된 캐스팅
pureQuery는 리터럴 값의 내재된 캐스팅을 수행할 수 있습니다. 예를 들어, pureQuery는 명령문 select DEPTNAME from DEPARTMENT WHERE DEPTNO = '1'의 리터럴 값이 숫자 유형임을 인식할 수 있습니다. 응용프로그램을 실행할 때, 응용프로그램이 데이터베이스에 대해 명령문을 실행하기 전에 pureQuery가 '1' 문자열 값을 1 숫자 값으로 대체할 수 있습니다.

데이터베이스 클라이언트에 대해 변환이 발생할 수 있으므로, 내재된 캐스팅을 지원하지 않은 데이터베이스 관리 시스템에 대해 이와 같은 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')

제한사항

DB2 CLI 및 IBM Data Server Driver 사용법 참고

DB2 CLI(Call Level Interface) 또는 IBM® Data Server Driver를 pureQuery 런타임에 사용하는 경우 pureQuery Runtime 등록 정보를 구성 키워드로 사용할 수 있습니다.

IBM CLI 키워드 구문
sqlLiteralSubstitution = ENABLE | DISABLE | NOT_SET
IBM Data Server Driver 구성 구문
<parameter name="sqlLiteralSubstitution" value="ENABLE | DISABLE | NOT_SET" />
.NET 연결 문자열 키워드에 대한 해당 IBM Data Server Provider
N/A

피드백