共用方式為


靜態 SQL 套件

DRDA 服務同時支援動態和靜態 SQL 語句執行。 DRDA Server 會處理動態 SQL 語句,例如將 EXCSQLIMM 命令 EXCSQLIMM (執行即時 SQL 語句) 和 EXCSQLSTT (Execute SQL 語句) ,方法是將一組基本的 ANSI SQL 92 Entry-Level DB2 語法轉換成 Microsoft SQL Server T-SQL 語法。 DRDA 服務會在兩個步驟中處理靜態 SQL 語句: (1) 系結時間和 (2) 執行時間。

在系結時,DRDA 服務會處理 BGNBND (開始將套件系結至 RDB) ,而 BNDSQLSTT (將 SQL 語句系結至 RDB 套件) 至SQL Server T-SQL 預存程式。 或者,DRDA 服務可以處理系結至 Microsoft 靜態 SQL for DB2 XML 檔案,也可以呼叫自訂可取代的系結接聽程式來處理系結 (,例如自訂或協力廠商套件系結器,以支援更廣泛的 SQL 語法轉換) 。 如需 Microsoft DRDA 用戶端和 DRDA 服務所支援之套件 XML 格式的詳細資訊,請參閱標題為 DB2 的靜態 SQL 主題。

在執行時間,DRDA 服務會處理 PRPSQLSTT (準備 SQL 語句) 、EXCSQLSTT (執行 SQL 語句) ,以及 OPNQRY (開啟查詢) 命令到 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 書籍。 如需自訂系結接聽程式的資訊,請參閱程式設計人員指南和程式設計人員參考。

處理 DRDA 系結套件和資料流程

在上圖中,DB2 for z/OS 內嵌 SQL 會在 DB2 預先符合階段轉換成 DB2 套件,然後在 DB2 系結複製階段期間轉換成 DRDA BGNBND 和 BNDSQLSTT 流程,然後在處理 DRDA 系結套件和語句流程時轉換成 DRDA 服務所儲存的程式SQL Server預存程式。

靜態 SQL 封裝語句

IBM DB2 for z/OS 產品和檔包含一組安裝驗證測試範例程式,包括適用于 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.  
  

上一個範例顯示 IBM DB2 for z/OS 範例 COBOL 程式與內嵌 SQL CONNECT 和 INSERT 語句。

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

上一個範例顯示 DB2 for z/OS 範例 COBOL 程式內嵌 SQL 語句,由 DB2 預編譯器擷取並儲存在 DB2 套件的靜態 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>  

上一個範例顯示 IBM DB2 for z/OS 範例 COBOL 程式靜態 SQL for DB2 封裝語句,由 DRDA 服務轉換成靜態 SQL for DB2 XML 檔案區段。 db2 for z/OS 不包含遠端 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 語句的 IBM DB2 for z/OS 範例 COBOL 程式靜態 SQL for DB2 封裝語句。

DRDA 服務套件系結選項

DRDA BGNBND (Begin Bind) 流程包含一組套件系結選項,可能會影響執行時間套件的儲存和執行。 DRDA 服務會將有限的系結選項對應至SQL Server建構。 DRDA 服務會將靜態 SQL for DB2 封裝 XML 檔案中的系結選項保留為預存程式內的批註,並選擇性地保留為預存程式上的擴充屬性。

系結套件建立控制項

DRDA 服務支援 DRDA BGNBND BNDCRTCTL (系結套件建立控制) ,指示 MsDrdaService 略過系結錯誤。 BNDCRTCTL 代碼點支援值的列舉。

  • BNDC HKONL (系結檢查僅)

  • BNDNERALW (系結不允許任何錯誤)

  • BNDERRALW (允許的系結錯誤)

  • BNDNERALW (系結不允許任何錯誤)

    根據預設,DRDA 服務預設為 BNDNERALW ([系結未允許錯誤]) 。 DRDA 服務會傳回 BGNBNDRM (BGNBND 回復訊息) ,指出發生下列其中一個實例時發生問題。

  • DRDA 到 XML 轉換問題

  • XML 到 DDL 轉換問題

  • 自訂系結接聽程式會在回呼介面上傳回 DDL

  • DRDA 服務無法執行 DDL 語句

    若要指示 DRDA 服務忽略錯誤並繼續處理封裝,DRDA AR 用戶端應該指定 BNDCRTCTL 選項 BNDERRALW ([允許) 系結錯誤]。

    搭配 DB2 for z/OS 使用 DB2 系統管理工具時,DB2 系統管理員可以指定 SQLERROR 「C」 選項, (繼續) 。 搭配 DB2 for z/OS 使用 DB2 系結複製工具時,DB2 程式設計人員可以流覽至 DB2 BIND PACKAGE 面板、指定 CHANGE CURRENT DEFAULTS=YES,然後設定 SQLERROR PROCESSING=C。

系結套件取代

DRDA 服務支援 DRDA BGNBND PKGRPLOPT (套件取代選項) ,指示 MsDrdaService 卸載並重新建立套件預存程式。 PKGRPLOPT 代碼點支援布林值。

目前,我們會在處理 BGNBND (Begin Bind) BNDSQLSTT (Bind SQL 語句) 時新增但不取代套件。 此選項會指示 DB2 讓 z/OS 卸載並建立套件的新複本。

  • PKGRPLALW (套件取代允許的)

  • PKGR (套件取代不允許)

    根據預設,DRDA 服務預設為 PKGRPLALW (套件取代允許) 。 DRDA 服務會在執行 CREATE PROCEDURE 語句之前執行 DROP PROCEDURE 語句。

系結選項清單

以下是在靜態 SQL for DB2 封裝 XML 檔案中定義的封裝系結選項清單。 這些元素的格式、類型和值與主機整合伺服器版本不同。 在 HIS 2010 (V8.5) 中,技術支援這些系結選項的 8.5 版。 在 HIS 2013 (V9.0) 中,這項技術支援這些系結選項的 9.0 版,更詳細且更具描述性。 HIS 2013 技術包含 XSD 架構檔案,可與靜態 SQL for DB2 套件 XML 檔案搭配使用

DRDA 服務靜態 SQL 資料指標

DRDA 服務會在處理 DRDA 開始系結和系結 SQL 語句命令時,將 DB2 套件的靜態 SQL 轉換成SQL Server預存程式,包括內嵌 SQL DECLARE CURSOR 語句。 根據資料指標類型,DRDA 服務會定義預存程式,以包含其他輸入參數 (「INVOKE_TYPE」) ,以定義資料指標上的動作 (例如開啟、擷取、關閉) 。 DRDA 服務會在SQL Server預存程式中包含批註,以表示系結選項 (例如固定資料列通訊協定) 和資料指標類型 (例如全域更新,唯讀) 。

宣告和開啟資料指標

DRDA 服務會呼叫具有叫用類型參數引數 「@_INVOKE_TYPE\_ = 0」 的SQL Server預存程式來開啟資料指標。 回應 DRDA AR OPNQRY (Open Query) 以支援取用者程式的 DECLARE CURSOR 和 OPEN CURSOR 命令,在回復 DRDA OPNQRY 命令時,將單一資料列傳回 DRDA AR,稱為 QRYDTA (查詢回應資料集) 。

針對資料指標擷取

DRDA 服務會呼叫具有叫用類型參數引數 「@_INVOKE_TYPE\_ = 1」 且參數引數 @_FETCH_ROW_COUNT\_ = n「 的 SQL Server預存程式來擷取資料指標 回應 DRDA AR CNTQRY (繼續查詢) 以支援取用者程式的 FETCH 命令,在回復 DRDA CNTQRY 命令時,將單一資料列或多個 (n 個) 資料列傳回 DRDA AR,以回復稱為 QRYDTA 的 DRDA CNTQRY 命令 (查詢回應資料設定) 。

為了改善效能,DRDA 服務會盡可能傳回每個擷取的多個資料列,除非針對單一資料列擷取定義封裝或資料指標以支援並行更新。 請參閱下面的 SQL 子句語法和系結選項的描述。

關閉游標

DRDA 服務會藉由呼叫具有叫用類型參數引數 「@_INVOKE_TYPE\_ = 2」 的SQL Server預存程式來關閉資料指標,以回應 DRDA AR CLSQRY (Close Query) 以支援取用者程式的 CLOSE CURSOR 命令,並傳回 DRDA AR 對稱為 ENDQRYRM (結束查詢回復訊息) 的 DRDA CLSQRY 命令。

如果 DECLARE CURSOR 語句包含 SQL 子句 WITH HOLD,DRDA 服務就會使用 DECLARE CURSOR GLOBAL 選項定義預存程式。 在此情況下,SQL Server會將游標保留在 DRDA AR 的關閉期間,並將要求認可到 DRDA 服務,以SQL Server連線。

SQL 子句語法

當 DECLARE CURSOR SQL 語句包含 SQL 子句 DECLARE CURSOR FOR SELECT 時,DRDA 服務會在預存程式中包含RETURN_RESULTSET批註。

當 DECLARE CURSOR SQL 語句包含 SQL 子句 WITH HOLD 時,DRDA 服務會在預存程式中包含CURSOR_WITH_HOLD批註。 DRDA 服務會使用 DECLARE CURSOR GLOBAL 選項定義預存程式,而SQL Server會在 DRDA AR 期間將游標保留在關閉並認可要求給 DRDA 服務,以SQL Server連線。

當 DECLARE CURSOR SQL 語句包含 SQL 子句 FOR UPDATE 時,DRDA 服務會在預存程式中包含CURSOR_FOR_UPDATE批註。 DRDA 服務會定義預存程式,而不需參數引數 @_FETCH_ROW_COUNT\_ = n」。 DRDA 服務只會針對每個擷取傳回單一資料列。

根據系結選項,DRDA 服務會將 SQL 子句語法 FOR READ ONLY 和 FOR FETCH 僅解譯為表示不可更新的資料指標,而 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  

使用 LMTBLKPRC 定義的 SELECT 語句範例,其中包含擷取資料列計數參數。

套件系結選項

DRDA 服務會將 DRDA BGNBND (Begin Bind) 選項 QRYBLKC (TL 解譯為查詢區塊通訊協定控制) 做為資料指標類型和 SQL 子句語法的覆寫,指示 DRDA 服務針對不可更新的資料指標傳回單一資料列或每個擷取的多個資料列。

預設 QRYBLKCTL 是 LMTBLKPRC (有限區塊查詢通訊協定) ,其會指示 DRDA 服務針對每個查詢區塊傳回多個資料列,而平均可符合 32K 區塊,而 DRDA DSS (資料流程結構) 定義資料行資料類型所需的位元組數。

選擇性地,DB2 程式設計人員可以使用 DB2 CURRENTDATA=YES 系結選項來系結套件, 轉譯為 DRDA BGNBND (Begin Bind) 選項 QRYBLKCTL (QUERY Block Protocol Control) FIXROWPRC (固定資料列查詢通訊協定) ,指示 DRDA 服務針對每個 CNTQRY (繼續查詢) 傳回單一 (固定資料列) ,以回應程式的 SQL FETCH 語句。

不需要資料指標

如果 bind 選項是預設的 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 語句範例。