Freigeben über


Statische SQL-Pakete

Der DRDA-Dienst unterstützt sowohl dynamische als auch statische SQL-Anweisungsausführung. Der DRDA-Server verarbeitet dynamische SQL-Anweisungen, z. B. die DRDA-Befehle EXCSQLIMM (Execute Immediate SQL Statement) und EXCSQLSTT (Execute SQL Statement), indem ein grundlegender Satz von ANSI SQL 92 Entry-Level DB2-Syntax in microsoft SQL Server T-SQL-Syntax konvertiert wird. Der DRDA-Dienst verarbeitet statische SQL-Anweisungen in zwei Schritten: (1) Bindungszeit und (2) Laufzeit.

Zum Zeitpunkt der Bindung übersetzt der DRDA-Dienst BGNBND (Begin Binding a Package to an RDB) und BNDSQLSTT (Bind SQL Statement to an RDB Package) in eine gespeicherte Prozedur des SQL Servers mit T-SQL. Optional kann der DRDA-Dienst Bindungen an Microsoft Static SQL für DB2-XML-Dateien verarbeiten oder Bindungen verarbeiten, indem ein benutzerdefinierter austauschbarer Bindlistener aufgerufen wird (z. B. benutzerdefinierter oder Drittanbieterpaketordner, der eine breitere Gruppe von SQL-Syntaxkonvertierungen unterstützen kann). Weitere Informationen zum Paket-XML-Format, das vom Microsoft DRDA-Client und dem DRDA-Dienst unterstützt wird, finden Sie im Thema "Static SQL for DB2".

Zur Laufzeit verarbeitet der DRDA-Dienst PRPSQLSTT (Prepare SQL Statement), EXCSQLSTT (Execute SQL Statement) und OPNQRY (Open Query)-Befehle in T-SQL CALL-Anweisungen. Zur Unterstützung von Servercursorvorgängen verarbeitet der DRDA-Dienst OPNQRY in einen geöffneten Cursorbefehl, CNTQRY (Continue Query) in einen Abrufbefehl und CLSQRY (Close Query) in einen schließenden Cursorbefehl. Der DRDA-Dienst verarbeitet Commit-, Rollback- und synchronisiert Protokollbefehle als Teil seiner Unterstützung für DRDA DUW (Verteilte Arbeitseinheit).

Paketbenennungskonvention

DRDA definiert ein vollqualifiziertes statisches SQL-Paket mit einem PKGNAM (RDB-Paketnamen), das aus diesen mehreren Teilen besteht.

  • RDBNAM (Relationaler Datenbankname)

  • RDBCOLID (RDB-Sammlungsbezeichner)

  • PKGID (RDB-Paketbezeichner)

RDBNAME.RDBCOLID.PKGID.PKGCNSTKN.PKGSN  

Das vorherige Beispiel zeigt den vollqualifizierten Paketnamen mit einem Konsistenztoken.

Warnung

Wenn mehrere Pakete denselben Wert für PKGNAM haben, werden die Pakete durch den VRSNAM (Versionsnamen) oder PKGCNSTKN (Paketnamenkonsistenztoken) unterschieden.

  • PKGCNSTKN (RDB Package Consistency Token)

  • VRSNAM (Versionsname)

Konvertieren von Paketen in gespeicherte Prozeduren

Der DRDA-Dienst konvertiert statische SQL für DB2-Pakete und eingebettete SQL-Anweisungen in gespeicherte SQL Server-Prozeduren, indem DRDA BGNBND (Begin Bind) und BNDSQLSTT (Bind SQL Statement)-Protokollflüsse und formatierte Datenwerte verarbeitet werden. Optional kann der DRDA-Dienst Bindungen als XML-Dateien verarbeiten, um später in gespeicherte Prozeduren oder Problembehandlungszwecke zu konvertieren. Darüber hinaus kann der DRDA-Dienst eine benutzerdefinierte Bindungslistenkomponente aufrufen, um BGNBND- und BNDSQLSTT-Flüsse zu verarbeiten. Weitere Informationen zum Verarbeiten von Paketbindungsflüssen finden Sie im Betriebsbuch. Informationen zu benutzerdefinierten Bindungslistenern finden Sie im Programmierhandbuch und in der Programmierreferenz.

Verarbeitung von DRDA-Bind-Paket und Datenflüssen

In der vorherigen Abbildung wird DB2 für z/OS Embedded SQL während der DB2-Precompile-Phase in DB2-Pakete umgewandelt, während der Bindcopy-Phase zu DRDA BGNBND- und BNDSQLSTT-Flows umgewandelt und schließlich beim Verarbeiten des DRDA-Bindpakets und der Anweisungs-Flows durch den DRDA-Dienst in SQL Server gespeicherte Prozeduren konvertiert.

Statische SQL-Paketanweisungen

Das IBM DB2 für z/OS-Produkt und die Dokumentation enthält eine Reihe von Testbeispielprogrammen zur Installationsprüfung, einschließlich eines COBOL für z/OS

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.  
  

Obiges Beispiel zeigt das IBM DB2 für z/OS COBOL-Beispielprogramm mit den eingebetteten SQL-Befehlen CONNECT und INSERT.

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

Das vorherige Beispiel zeigt ein IBM DB2 für z/OS-Beispiel-COBOL-Programm, dessen eingebettete SQL-Anweisungen vom DB2-Präcompiler extrahiert und in einem statischen SQL für das DB2-Paket gespeichert werden, mit einem Abschnitt pro Anweisung.

<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>  

Das vorherige Beispiel zeigt ein COBOL-Beispielprogramm für IBM DB2 unter z/OS, bei dem statische SQL-Anweisungen für DB2-Pakete vom DRDA-Dienst in einen Abschnitt einer statischen SQL-Datei im DB2-XML-Format konvertiert wurden. DB2 für z/OS enthält nicht die CONNECT-Anweisung im remote-DRDA-definierten Paket.

/****** 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  
  

Das vorherige Beispiel zeigt IBM DB2 für z/OS-Beispiel-COBOL-Programm static SQL für DB2-Paketanweisungen, die vom DRDA-Dienst in eine SQL Server CREATE PROCEDURE-Anweisung konvertiert werden.

DRDA-Dienstpaketbindungsoptionen

Der DRDA BGNBND -Fluss (Begin Bind) enthält eine Reihe von Paketbindungsoptionen, die den Speicher und die Ausführung des Laufzeitpakets beeinflussen können. Der DRDA-Dienst ordnet eine begrenzte Anzahl von Bindungsoptionen sql Server-Konstrukten zu. Der DRDA-Dienst behält die Bindungsoptionen in der statischen SQL für DB2-Paket-XML-Datei als Kommentare in der gespeicherten Prozedur und optional als erweiterte Eigenschaften für die gespeicherte Prozedur bei.

Steuerelement für Paketerstellung binden

Der DRDA-Dienst unterstützt die DRDA BGNBND BNDCRTCTL (Bind Package Creation Control), die msDrdaService anweist, Bindungsfehler zu überspringen. Der BNDCRTCTL-Codepunkt unterstützt eine Enumeration von Werten.

  • BNDCHKONL(Nur Bindungsprüfung)

  • BNDNERALW (Keine Fehler erlaubt beim Binden)

  • BNDERRALW (Bindungsfehler zulässig)

  • BNDNERALW (Bind No Errors Allowed - Keine Fehler erlaubt)

    Standardmäßig ist der DRDA-Dienst auf BNDNERALW festgelegt (Keine Fehler zulässig). Der DRDA-Dienst gibt eine BGNBNDRM (BGNBND Reply Message) mit einem Fehler zurück, der das Problem angibt, wenn einer der folgenden Fälle eintritt.

  • DRDA-zu-XML-Konvertierungsproblem

  • XML-zu-DDL-Konvertierungsproblem

  • Benutzerdefinierte Bind-Listener geben DDL über die Rückrufschnittstelle zurück.

  • DRDA-Dienst kann die DDL-Anweisung nicht ausführen

    Um den DRDA-Dienst anzuweisen, Fehler zu ignorieren und die Verarbeitung eines Pakets fortzusetzen, sollte der DRDA AR-Client BNDCRTCTL-Option BNDERRALW (Bind Errors Allowed) angeben.

    Bei Verwendung des DB2-Verwaltungstools mit DB2 für z/OS kann der DB2-Administrator die Option SQLERROR "C" (Weiter) angeben. Wenn Sie das DB2-Bind-Copy-Tool mit DB2 für z/OS verwenden, kann der DB2-Programmierer zum DB2-BIND-PACKAGE-Fenster navigieren, CHANGE CURRENT DEFAULTS=YES angeben und dann SQLERROR PROCESSING=C festlegen.

Binde Paket ersetzen

Der DRDA-Dienst unterstützt die DRDA BGNBND PKGRPLOPT (Paketersetzungsoption), die den MsDrdaService anweist, die gespeicherte Paketprozedur abzulegen und neu zu erstellen. Der PKGRPLOPT-Codepunkt unterstützt einen booleschen Wert.

Derzeit fügen wir Pakete hinzu, ersetzen sie aber nicht, wenn BGNBND (Begin Bind) BNDSQLSTT (Bind SQL-Anweisung) verarbeitet wird. Mit dieser Option wird DB2 für z/OS angewiesen, eine neue Kopie des Pakets abzulegen und zu erstellen.

  • PKGRPLALW (Paketersetzung zulässig)

  • PKGRPLNA (Paket-Ersetzung nicht erlaubt)

    Standardmäßig ist der DRDA-Dienst auf PKGRPLALW (Paketersetzung zulässig) festgelegt. Der DRDA-Dienst führt eine DROP PROCEDURE-Anweisung aus, bevor er eine CREATE PROCEDURE-Anweisung ausführt.

Liste der Bindungsoptionen

Es folgt eine Liste der Paketbindungsoptionen, die in der statischen SQL für DB2-Paket-XML-Datei definiert sind. Das Format dieser Elemente, Typen und Werte unterscheidet sich von der Version des Hostintegrationsservers zu einer anderen. In HIS 2010 (V8.5) unterstützte die Technologie ein Version 8.5-Format dieser Bindungsoptionen. In HIS 2013 (V9.0) unterstützt die Technologie ein Version 9.0-Format dieser Bindungsoptionen, was ausführlicher und beschreibender ist. Die HIS 2013-Technologie enthält eine XSD-Schemadatei für die Verwendung mit der statischen SQL für DB2-Paket-XML-Datei

STATISCHE SQL-Cursor des DRDA-Diensts

Der DRDA-Dienst wandelt statische SQL für DB2-Pakete in gespeicherte SQL-Server-Prozeduren um, wenn DRDA Begin-Bind- und Bind-SQL-Anweisungen verarbeitet werden, einschließlich eingebetteter SQL DECLARE CURSOR-Anweisungen. Je nach Cursortyp definiert der DRDA-Dienst die gespeicherte Prozedur, um zusätzliche Eingabeparameter ("INVOKE_TYPE") einzuschließen, um die Aktion auf dem Cursor zu definieren (z. B. öffnen, abrufen, schließen). Der DRDA-Dienst enthält Kommentare in der gespeicherten SQL Server-Prozedur, um die Bindungsoptionen (z. B. Festzeilenprotokoll) und den Cursortyp (z. B. global, zum Aktualisieren, schreibgeschützt) anzugeben.

Deklarieren und Öffnen eines Cursors

Der DRDA-Dienst öffnet einen Cursor, indem eine gespeicherte SQL Server-Prozedur mit einem Aufruftypparameterargument "@_INVOKE_TYPE\_ = 0" aufgerufen wird, als Reaktion auf einen DRDA AR OPNQRY (Open Query) zur Unterstützung des DECLARE CURSOR- und OPEN CURSOR-Befehls eines Verbraucherprogramms, wobei eine einzelne Zeile an den DRDA AR in einer Antwort auf den DRDA OPNQRY-Befehl namens QRYDTA (Query Answer Data Set) zurückgegeben wird.

Abruf gegen einen Cursor

Der DRDA-Dienst führt einen Abruf gegen einen Cursor aus, indem er eine gespeicherte SQL Server-Prozedur mit dem Parameterargument-Aufruftyp "@_INVOKE_TYPE\_ = 1" und dem Parameterargument "@FETCH_ROW_COUNT\_ = n" aufruft, als Reaktion auf eine DRDA AR CNTQRY (Continue Query) zur Unterstützung der FETCH-Befehle eines Verbraucherprogramms. In der Antwort auf den DRDA CNTQRY-Befehl, der als QRYDTA (Query Answer Data Set) bezeichnet wird, wird eine einzelne Zeile oder mehrere Zeilen (n) an das DRDA AR zurückgegeben.

Um die Leistung zu verbessern, gibt der DRDA-Dienst nach Möglichkeit mehrere Zeilen pro Abruf zurück, es sei denn, das Paket oder der Cursor ist für den Abruf einzelner Zeilen definiert, um gleichzeitige Aktualisierungen zu unterstützen. Siehe Beschreibung der SQL-Klauselsyntax und bindungsoptionen unten.

Schließen eines Cursors

Der DRDA-Dienst schließt einen Cursor, indem er eine gespeicherte SQL Server-Prozedur mit dem Aufruftypparameter-Argument "@_INVOKE_TYPE\_ = 2" aufruft. Dies erfolgt als Reaktion auf eine DRDA AR CLSQRY (Close Query) zur Unterstützung des CLOSE CURSOR-Befehls eines Verbraucherprogramms. Dabei wird an den DRDA AR eine Antwort auf den DRDA CLSQRY-Befehl zurückgegeben, die als ENDQRYRM (Ende der Abfrageantwortnachricht) bezeichnet wird.

Wenn die DECLARE CURSOR-Anweisungen eine SQL-Klausel WITH HOLD enthalten, definiert der DRDA-Dienst die gespeicherte Prozedur mit einer DECLARE CURSOR GLOBAL-Option. In diesem Fall behält SQL Server den Cursor über schließende und Commit-Anforderungen für die Dauer der DRDA AR an den DRDA-Dienst zur SQL Server-Verbindung aufrecht.

SQL-Klauselsyntax

Der DRDA-Dienst enthält einen RETURN_RESULTSET Kommentar in der gespeicherten Prozedur, wenn die DECLARE CURSOR SQL-Anweisung die SQL-Klausel DECLARE CURSOR FOR SELECT enthält.

Der DRDA-Dienst enthält einen CURSOR_WITH_HOLD Kommentar in der gespeicherten Prozedur, wenn die DECLARE CURSOR SQL-Anweisung die SQL-Klausel WITH HOLD enthält. Der DRDA-Dienst definiert die gespeicherte Prozedur mit der Option DECLARE CURSOR GLOBAL, und SQL Server behält den Cursor über Schließ- und Commitanforderungen hinweg während der gesamten Verbindung von DRDA AR über den DRDA-Dienst zu SQL Server bei.

Der DRDA-Dienst enthält einen CURSOR_FOR_UPDATE Kommentar in der gespeicherten Prozedur, wenn die DECLARE CURSOR SQL-Anweisung die SQL-Klausel FOR UPDATE enthält. Der DRDA-Dienst definiert die gespeicherte Prozedur ohne das Parameterargument @_FETCH_ROW_COUNT\_ = n". Der DRDA-Dienst gibt nur eine einzelne Zeile pro Abruf zurück.

Je nach Bindungsoption interpretiert der DRDA-Dienst die SQL-Klauselsyntax FÜR NUR LESEN und NUR ABRUFEN als Hinweis auf einen nicht aktualisierbaren Cursor, mit dem der DRDA-Dienst mehrere Zeilen pro CNTQRY abrufen kann. Der DRDA-Dienst definiert die gespeicherte Prozedur mit dem Parameterargument @_FETCH_ROW_COUNT\_ = n". Der DRDA-Dienst gibt eine einzelne Zeile oder mehrere Zeilen pro Abruf basierend auf der Bindungsoption zurück.

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  

Beispiele für SELECT-Anweisungen, die mithilfe von LMTBLKPRC definiert wurden und den Parameter "Abrufzeilenanzahl" enthalten.

Paketbindungsoption

Der DRDA-Dienst interpretiert die DRDA-BGNBND-Option (Begin Bind) QRYBLKCTL (Query Block Protocol Control) als Überschreibung für den Cursortyp und die SQL-Klauselsyntax, was den DRDA-Dienst anweist, entweder eine einzelne Zeile pro Abruf oder mehrere Zeilen pro Abruf für nicht aktualisierbare Cursor zurückzugeben.

Die Standardmäßige QRYBLKCTL ist LMTBLKPRC(Limited Block Query Protocol), das den DRDA-Dienst anweist, mehrere Zeilen pro Abfrageblock zurückzugeben, soweit dies im Durchschnitt in einen 32K-Block passt, weniger die Byes, die für die DRDA DSS (Data Stream Structures) zum Definieren der Spaltendatentypen erforderlich sind.

Optional kann der DB2-Programmierer ein Paket mit der DB2-CURRENTDATA=YES-Bind-Option binden, die zur DRDA-Option BGNBND (Begin Bind) QRYBLKCTL (Query Block Protocol Control) FIXROWPRC (Fixed Row Query Protocol) übersetzt wird, um den DRDA-Dienst anzuweisen, eine einzelne (fixe Zeile) pro CNTQRY (Continue Query) als Reaktion auf die SQL-FETCH-Anweisung des Programms zurückzugeben.

Kein Cursor erforderlich

Wenn es sich bei der Bindungsoption um die Standardoption LMTBLKPRC handelt, definiert der Data Server eine gespeicherte Prozedur mit einer SELECT-Anweisung, aber keinen DECLARE CURSOR, wenn die Anweisung eindeutig schreibgeschützt ist. Siehe Beschreibung der SQL-Klauselsyntax und bindungsoptionen unten.

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  
  

Beispiele für SELECT-Anweisungen, die keine SQL Server-Cursor erfordern.