정적 SQL 패키지

DRDA 서비스는 동적 및 정적 SQL 문 실행을 모두 지원합니다. DRDA 서버는 동적 SQL 문(예: DRDA 명령 EXCSQLIMM(직접 실행 SQL 문) 및 EXCSQLSTT(SQL 문 실행)를 처리합니다. ANSI SQL 92 Entry-Level DB2 구문의 기본 집합을 Microsoft SQL Server T-SQL 구문으로 변환합니다. DRDA 서비스는 (1) 바인딩 시간 및 (2) 런타임의 두 단계로 정적 SQL 문을 처리합니다.

바인딩 시 DRDA 서비스는 BGNBND(RDB에 패키지 바인딩 시작) 및 BNDSQLSTT(SQL 문을 RDB 패키지에 바인딩)를 SQL Server T-SQL 저장 프로시저로 처리합니다. 필요에 따라 DRDA 서비스는 DB2 XML 파일용 Microsoft 정적 SQL에 바인딩을 처리하거나 사용자 지정 바인드 수신기(예: 더 광범위한 SQL 구문 변환을 지원할 수 있는 사용자 지정 또는 타사 패키지 바인더)를 호출하여 바인딩을 처리할 수 있습니다. Microsoft DRDA 클라이언트 및 DRDA 서비스에서 지원하는 패키지 XML 형식에 대한 자세한 내용은 DB2용 정적 SQL 항목을 참조하세요.

런타임에 DRDA 서비스는 PRPSQLSTT(SQL 문 준비), EXCSQLSTT(SQL 문 실행) 및 OPNQRY(Open Query) 명령을 T-SQL CALL 문으로 처리합니다. 서버 커서 작업을 지원하기 위해 DRDA 서비스는 OPNQRY를 열린 커서 명령으로 처리하고, CNTQRY(쿼리 계속)를 페치 명령으로, CLSQRY(쿼리 닫기)를 닫는 커서 명령으로 처리합니다. DRDA 서비스는 DRDA DUW(분산 작업 단위)에 대한 지원의 일환으로 로그 명령을 커밋, 롤백 및 동기화합니다.

패키지 명명 규칙

DRDA는 이러한 여러 부분으로 구성된 PKGNAM(RDB 패키지 이름)을 사용하여 정규화된 정적 SQL 패키지를 정의합니다.

  • RDBNAM(관계형 데이터베이스 이름)

  • RDBCOLID(RDB 컬렉션 식별자)

  • PKGID(RDB 패키지 식별자)

RDBNAME.RDBCOLID.PKGID.PKGCNSTKN.PKGSN  

이전 예제에서는 일관성 토큰이 있는 정규화된 패키지 이름을 보여 줍니다.

경고

둘 이상의 패키지에 PKGNAM에 대해 동일한 값이 있는 경우 패키지는 VRSNAM(버전 이름) 또는 PKGCNSTKN(패키지 이름 일관성 토큰)으로 구분됩니다.

  • PKGCNSTKN(RDB 패키지 일관성 토큰)

  • VRSNAM(버전 이름)

패키지를 저장 프로시저로 변환

DRDA 서비스는 DRDA BGNBND(Begin Bind) 및 BNDSQLSTT(Bind SQL 문) 프로토콜 흐름 및 형식이 지정된 데이터 값을 처리하여 DB2 패키지 및 포함된 SQL 문에 대한 정적 SQL을 SQL Server 저장 프로시저로 변환합니다. 필요에 따라 DRDA 서비스는 저장 프로시저로 나중에 변환하거나 문제 해결을 위해 바인딩을 XML 파일로 처리할 수 있습니다. 또한 DRDA 서비스는 사용자 지정 바인딩 수신기 구성 요소를 호출하여 BGNBND 및 BNDSQLSTT 흐름을 처리할 수 있습니다. 패키지 바인딩 흐름 처리에 대한 자세한 내용은 Operations Book을 참조하세요. 사용자 지정 바인드 수신기에 대한 자세한 내용은 프로그래머 가이드 및 프로그래머 참조를 참조하세요.

DRDA 바인딩 패키지 및 데이터 흐름 처리

이전 그림에서 z/OS용 DB2에 내장된 SQL은 DB2 사전 컴파일 단계 동안 DB2 패키지로 변환된 다음 DB2 바인드 복사 단계 동안 DRDA BGNBND 및 BNDSQLSTT 흐름으로 변환되며, DRDA 바인드 패키지 및 문 흐름을 처리할 때 DRDA 서비스에서 SQL Server 저장 프로시저로 변환됩니다.

정적 SQL 패키지 명령문

z/OS용 IBM DB2 제품 및 설명서에는 z/OS용 COBOL을 비롯한 설치 확인 테스트 샘플 프로그램 세트가 포함되어 있습니다.

EXEC SQL CONNECT TO :TEMPLOC END-EXEC  
EXEC SQL INSERT INTO VHDEPT   
VALUES (:DEPT-NUMB, :DEPT-NAME, :DEPT-MGR,   
:DEPT-ADMR, :DEPT-LOC)  
END-EXEC.  
  

이전 예제에서는 포함된 SQL CONNECT 및 INSERT 문이 있는 z/OS용 IBM DB2 샘플 COBOL 프로그램을 보여 줍니다.

CONNECT TO :H  
INSERT INTO VHDEPT VALUES (:H, :H, :H, :H, :H )  
  

이전 예제에서는 DB2 사전 컴파일러에서 추출하여 DB2 패키지에 대한 정적 SQL에 저장된 Z/OS용 IBM DB2 샘플 COBOL 프로그램 포함된 SQL 문을 문당 한 섹션씩 보여줍니다.

<Section Number="18" Alias="">  
  <Statement Number="18">INSERT INTO VHDEPT VALUES ( :H , :H , :H , :H , :H ) </Statement>  
  <Parameters>  
    <Parameter Name="DEPT-NUMB" Type="Char" Length="3" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-NAME" Type="Char" Length="36" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-MGR" Type="Char" Length="6" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-ADMR" Type="Char" Length="3" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-LOC" Type="Char" Length="16" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
  </Parameters>  
</Section>  

이전 예제에서는 DRDA 서비스에서 DB2 XML 파일 섹션의 정적 SQL로 변환된 DB2 패키지 문에 대한 IBM DB2 for z/OS 샘플 COBOL 프로그램 정적 SQL을 보여 줍니다. z/OS용 DB2는 원격 DRDA 정의 패키지에 CONNECT 문을 포함하지 않습니다.

/****** BNDOPT: <Options><BNDCHKEXS>BNDEXSOPT</BNDCHKEXS><BNDCRTCTL>BNDNERALW</BNDCRTCTL><BNDEXPOPT>EXPNON</BNDEXPOPT><DFTRDBCOL>CXE001</DFTRDBCOL><DGRIOPRL>1</DGRIOPRL><PKGATHOPT>PKGATHKP</PKGATHOPT><PKGISOLVL>ISOLVLCS</PKGISOLVL><PKGOWNID>CXE001</PKGOWNID><PKGRPLOPT>PKGRPLALW</PKGRPLOPT><QRYBLKCTL>FIXROWPRC</QRYBLKCTL><RDBRLSOPT>RDBRLSCMM</RDBRLSOPT><STTDATFMT>USADATFMT</STTDATFMT><STTDECDEL>DECDELPRD</STTDECDEL><STTSTRDEL>STRDELAP</STTSTRDEL><STTTIMFMT>USATIMFMT</STTTIMFMT></Options> ******/  
  
CREATE PROCEDURE [DSN8910].[DSN8HC3_18BBB2BA1492DAC8_19] @DEPT_NUMB Char(3), @DEPT_NAME Char(36), @DEPT_MGR Char(6), @DEPT_ADMR Char(3), @DEPT_LOC Char(16)  
AS  
begin  
      INSERT INTO VHDEPT VALUES ( @DEPT_NUMB , @DEPT_NAME , @DEPT_MGR , @DEPT_ADMR , @DEPT_LOC )   
      return @@ROWCOUNT  
end  
GO  
  

이전 예제에서는 DRDA 서비스에서 SQL Server CREATE PROCEDURE 문으로 변환한 DB2 패키지 문에 대한 Z/OS용 IBM DB2 샘플 COBOL 프로그램 정적 SQL을 보여 줍니다.

DRDA 서비스 패키지 바인딩 옵션

DRDA BGNBND(Begin Bind) 흐름에는 런타임 패키지의 스토리지 및 실행에 영향을 줄 수 있는 패키지 바인딩 옵션 집합이 포함되어 있습니다. DRDA 서비스는 제한된 수의 바인딩 옵션을 SQL Server 구문에 매핑합니다. DRDA 서비스는 DB2 패키지 XML 파일의 정적 SQL에서 바인딩 옵션을 저장 프로시저 내의 주석으로, 필요에 따라 저장 프로시저의 확장 속성으로 유지합니다.

바인드 패키지 생성 제어

DRDA 서비스는 MSDrdaService에 바인딩 오류를 건너뛰도록 지시하는 DRDA BGNBND BNDCRTCTL(바인딩 패키지 만들기 컨트롤)을 지원합니다. BNDCRTCTL 코드 포인트는 값의 열거를 지원합니다.

  • BNDCHKONL(바인딩 검사만 해당)

  • BNDNERALW(오류가 허용되지 않음)

  • BNDERRALW(바인딩 오류 허용)

  • BNDNERALW(허용되는 오류 바인딩 안 됨)

    기본적으로 DRDA 서비스는 BNDNERALW(허용되는 오류 없음 바인딩)로 설정됩니다. DRDA 서비스는 다음 인스턴스 중 하나가 발생할 때 문제를 나타내는 오류와 함께 BGNBNDRM(BGNBND 회신 메시지)을 반환합니다.

  • DRDA-XML 변환 문제

  • XML-DDL 변환 문제

  • 사용자 지정 바인딩 수신기는 콜백 인터페이스에서 DDL을 반환합니다.

  • DRDA 서비스는 DDL 문을 실행할 수 없습니다.

    DRDA 서비스에 오류를 무시하고 패키지를 계속 처리하도록 지시하려면 DRDA AR 클라이언트는 BNDCRTCTL 옵션 BNDERRALW(바인딩 오류 허용)를 지정해야 합니다.

    dB2 관리 도구를 z/OS용 DB2와 함께 사용하는 경우 DB2 관리자는 SQLERROR "C" 옵션을 지정할 수 있습니다(계속). dB2 바인딩 복사 도구를 z/OS용 DB2와 함께 사용하는 경우 DB2 프로그래머가 DB2 BIND PACKAGE 패널로 이동하고 CHANGE CURRENT DEFAULTS=YES를 지정한 다음 SQLERROR PROCESSING=C를 설정할 수 있습니다.

패키지 교체 바인드

DRDA 서비스는 MSDrdaService에 패키지 저장 프로시저를 삭제하고 다시 만들도록 지시하는 DRDA BGNBND PKGRPLOPT(패키지 교체 옵션)를 지원합니다. PKGRPLOPT 코드 포인트는 불리언 값을 지원한다.

현재는 BGNBND(바인딩 시작) BNDSQLSTT(Bind SQL 문)를 처리할 때 패키지를 추가하지만 대체하지 않습니다. 이 옵션은 z/OS용 DB2에 패키지의 새 복사본을 삭제하고 만들도록 지시합니다.

  • PKGRPLALW(패키지 교체 허용)

  • PKGRPLNA(패키지 교체 허용 안 됨)

    기본적으로 DRDA 서비스는 기본적으로 PKGRPLALW(패키지 교체 허용)로 설정됩니다. DRDA 서비스는 CREATE PROCEDURE 문을 실행하기 전에 DROP PROCEDURE 문을 실행합니다.

바인딩 옵션 목록

다음은 DB2 패키지 XML 파일의 정적 SQL에 정의된 패키지 바인딩 옵션 목록입니다. 이러한 요소, 형식 및 값의 형식은 호스트 통합 서버 버전과 다른 버전으로 다릅니다. HIS 2010(V8.5)에서 이 기술은 이러한 바인딩 옵션의 버전 8.5 형식을 지원했습니다. HIS 2013(V9.0)에서 이 기술은 이러한 바인딩 옵션의 버전 9.0 형식을 지원합니다. 이 옵션은 더 자세히 설명합니다. HIS 2013 기술에는 정적 SQL for DB2 패키지 XML 파일과 함께 사용할 XSD 스키마 파일이 포함되어 있습니다.

DRDA 서비스 정적 SQL 커서

DRDA 서비스는 DRDA의 begin bind 및 bind SQL 문 명령을 처리할 때, DB2 패키지의 정적 SQL을 SQL Server 저장 프로시저로 변환하며, 포함된 SQL DECLARE CURSOR 문도 포함합니다. 커서 유형에 따라 DRDA 서비스는 추가 입력 매개 변수("INVOKE_TYPE")를 포함하는 저장 프로시저를 정의하여 커서에 대한 작업(예: 열기, 가져오기, 닫기)을 정의합니다. DRDA 서비스에는 바인딩 옵션(예: 고정 행 프로토콜) 및 커서 유형(예: 업데이트의 경우 전역, 읽기 전용)을 나타내는 설명이 SQL Server 저장 프로시저에 포함되어 있습니다.

커서 선언 및 열기

DRDA 서비스는 소비자 프로그램의 DECLARE CURSOR 및 OPEN CURSOR 명령을 지원하기 위해 DRDA AR OPNQRY(Open Query)에 대한 응답으로 호출 형식 매개 변수 인수 "@_INVOKE_TYPE\_ = 0"을 사용하여 SQL Server 저장 프로시저를 호출하여 커서를 열고, QRYDTA(쿼리 응답 데이터 집합)라는 DRDA OPNQRY 명령에 대한 회신으로 DRDA AR에 단일 행을 반환합니다.

커서에 대한 페치

DRDA 서비스는 호출 형식 매개 변수 인수 "@_INVOKE_TYPE\_ = 1"과 매개 변수 인수 "@_FETCH_ROW_COUNT_ = n"을 사용하여 SQL Server 저장 프로시저를 호출하여 커서에 대해 데이터를 가져옵니다. 이는 소비자 프로그램의 FETCH 명령을 지원하기 위한 DRDA AR CNTQRY(계속 쿼리)에 대한 응답으로 수행되며, DRDA CNTQRY 명령에 대한 회신에서 QRYDTA(쿼리 응답 데이터 집합)로 DRDA AR에 단일 행 또는 여러(n) 행을 반환합니다.

성능을 향상시키기 위해 DRDA 서비스는 동시 업데이트를 지원하기 위해 패키지 또는 커서가 단일 행 페치에 대해 정의되지 않는 한 가능한 경우 페치당 여러 행을 반환합니다. 아래의 SQL 절 구문 및 바인딩 옵션에 대한 설명을 참조하세요.

커서 닫기

DRDA 서비스는 소비자 프로그램의 CLOSE CURSOR 명령을 지원하기 위해 DRDA AR CLSQRY(닫기 쿼리)에 대한 응답으로 호출 형식 매개 변수 인수 "@_INVOKE_TYPE\_ = 2"로 SQL Server 저장 프로시저를 호출하여 커서를 닫고, DRDA AR에 ENDQRYRM(쿼리 회신 메시지 종료)이라는 DRDA CLSQRY 명령에 대한 회신을 반환합니다.

DECLARE CURSOR 문에 WITH HOLD SQL 절이 포함된 경우 DRDA 서비스는 DECLARE CURSOR GLOBAL 옵션을 사용하여 저장 프로시저를 정의합니다. 이 경우 SQL Server는 DRDA AR에서 SQL Server로의 DRDA 서비스 연결이 유지되는 동안 닫기 및 커밋 요청 후에도 커서를 유지합니다.

SQL 절 구문

DRDA 서비스는 DECLARE CURSOR SQL 문에 SELECT용 SQL 절 DECLARE CURSOR가 포함된 경우 저장 프로시저에 RETURN_RESULTSET 주석을 포함합니다.

DRDA 서비스는 DECLARE CURSOR SQL 문에 WITH HOLD SQL 절이 포함된 경우 저장 프로시저에 CURSOR_WITH_HOLD 주석을 포함합니다. DRDA 서비스는 DECLARE CURSOR GLOBAL 옵션으로 저장 프로시저를 정의하며, SQL Server는 DRDA AR과 DRDA 서비스 간의 SQL Server 연결이 유지되는 동안, 닫기 및 커밋 요청 이후에도 커서를 유지합니다.

DRDA 서비스는 DECLARE CURSOR SQL 문에 FOR UPDATE SQL 절이 포함된 경우 저장 프로시저에 CURSOR_FOR_UPDATE 주석을 포함합니다. DRDA 서비스는 매개 변수 인수 @_FETCH_ROW_COUNT\_ = n"없이 저장 프로시저를 정의합니다. DRDA 서비스는 페치당 단일 행만 반환합니다.

바인딩 옵션에 따라 DRDA 서비스는 SQL 구문 FOR READ ONLY 및 FOR FETCH ONLY를 수정할 수 없는 커서로 해석합니다. DRDA 서비스는 이 커서를 사용하여 CNTQRY당 여러 행을 가져올 수 있습니다. DRDA 서비스는 매개 변수 인수 @_FETCH_ROW_COUNT\_ = n"을 사용하여 저장 프로시저를 정의합니다. DRDA 서비스는 바인딩 옵션에 따라 페치당 단일 행 또는 여러 행을 반환합니다.

DECLARE C2 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR READ ONLY  
DECLARE C4 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR FETCH ONLY DECLARE C8 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1  

fetch 행 개수 매개 변수를 포함하는 LMTBLKPRC를 사용하여 정의된 SELECT 문의 예입니다.

패키지 바인딩 옵션

DRDA 서비스는 DRDA BGNBND(Begin Bind) 옵션 QRYBLKCTL(쿼리 블록 프로토콜 제어)을 커서 형식 및 SQL 절 구문에 대한 재정의로 해석하여 DRDA 서비스가 업데이트할 수 없는 커서에서 페치당 단일 행 또는 페치당 여러 행을 반환하도록 지시합니다.

기본 QRYBLKCTL은 LMTBLKPRC(제한된 블록 쿼리 프로토콜)로, DRDA 서비스가 쿼리 블록당 여러 행을 반환하도록 지시하며, 평균적으로 32K 블록에 맞게 열 데이터 형식을 정의하기 위해 DRDA DSS(데이터 스트림 구조)에 필요한 바이트보다 적습니다.

필요에 따라 DB2 프로그래머가 DB2 CURRENTDATA=YES 바인딩 옵션을 사용하여 패키지를 바인딩할 수 있습니다. 이 옵션은 DRDA BGNBND(Begin Bind) 옵션 QRYBLKCTL(쿼리 블록 프로토콜 제어) FIXROWPRC(고정 행 쿼리 프로토콜)로 변환되어 DRDA 서비스에 프로그램의 SQL FETCH 문에 대한 응답으로 CNTQRY당 단일(고정 행)을 반환하도록 지시합니다.

커서가 필요하지 않음

바인딩 옵션이 기본 LMTBLKPRC인 경우 Data Server는 문이 명확하게 읽기 전용인 경우 SELECT 문을 사용하지만 DECLARE CURSOR가 없는 저장 프로시저를 정의합니다. 아래의 SQL 절 구문 및 바인딩 옵션에 대한 설명을 참조하세요.

DECLARE C1 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR READ ONLY  
DECLARE C3 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR FETCH ONLY  
DECLARE C7 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1  
  

SQL Server 커서가 필요하지 않은 SELECT 문의 예입니다.