X4 Help Center

PreparedStatementBatch: SQL mit Werten im Batch-Modus

Der JDBC Iterator führt mehrere SQL-Anweisungen auf einmal im Batch-Modus aus, wenn sie in folgender Input-XML-Struktur abgelegt werden. Dabei sind lediglich SQL-Anweisungen möglich, die kein Result Set zurückliefern, also z.B. keine Abfragen mit SELECT.

Alternativ können Sie ab Release 5.0 der X4 Suite auch SQL-Anweisungen mit benannten Parametern mit oder ohne Batch-Modus ausführen, siehe NamedPreparedStatementBatch: SQL mit benannten Parametern im Batch-Modus 1.

Hinweis zur Verwendung von CLOB-Feldern:

Bei Verwendung der Aktion PreparedStatementBatch ist zu beachten, dass Felder vom Typ CLOB ausschließlich als reine Zeichenketten (Character Data) verarbeitet werden.

Der Connector erwartet für CLOB-Felder einen direkten Textknoten als Eingabewert. Wird stattdessen eine XML-Struktur übergeben, enthält das entsprechende Element keinen direkten Textinhalt. In diesem Fall wird kein Wert an das Prepared Statement übergeben, sodass kein Datensatz in die Datenbank geschrieben wird. Dieses Verhalten tritt ohne Fehlermeldung auf.

Empfehlung

Wenn XML-Inhalte in einem CLOB-Feld gespeichert werden sollen, müssen diese vor der Übergabe explizit in Text umgewandelt werden, z. B. durch Verwendung einer CDATA-Sektion.

Beispiel

Definition der CLOB-Spalte:

<column index="..." mode="in" name="..." type="CLOB"/>

Übergabe des XML-Inhalts als Text mittels CDATA-Wrapper:

<INPUT>
  <xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
  <Object>Test</Object>
  <xsl:text disable-output-escaping="yes">]]></xsl:text>
</INPUT>

Nur wenn der XML-Inhalt als zusammenhängender Textknoten vorliegt, wird er korrekt an das Prepared Statement übergeben und in der Datenbank gespeichert.

Input

<Beliebiger Elementname>
   <preparedstatementbatch resulttag="Ergebniselementname" timezone="Zeitzone" 
    format="Datumsformat">
      <sql>  
         <!-- SQL-Anweisung -->
      </sql>
      <columns>
         <column mode="in" name="frei wählbarer NCName" 
          index="Platzhalter-Index" type="Datentyp" 
          timezone="Zeitzone" format="Datumsformat">
         </column>
      </columns>
      <rowset>
         <row>
            <Name><!--Wert--></Name>
         </row> 
         <!-- Weitere <row>-Elemente für Batch-Modus -->
      </rowset> 
   </preparedstatementbatch> 
</Beliebiger Elementname>

Für jedes Element <preparedstatementbatch/> gilt:

Falls Sie innerhalb der SQL-Anweisung oder für die Werte bzw. Daten der Tabellenspalten Zeichen verwenden, die in XML eine Bedeutung besitzen, maskieren Sie die SQL-Anweisung mit einem umgebenden CDATA -Block, z. B. <![CDATA[ UPDATE PROCESS SET X4_VERSION=4 WHERE X4_DURATION=? ]]> oder <rowset><row><Name><!CDATA[ XML Zeichen “<“ in CDATA Element]]></Name></row></rowset>.

So wird sichergestellt, dass die Zeichen im CDATA-Element nicht als XML interpretiert werden, sondern als Daten für den Adapter.

Für jedes Element <column/> gilt:

  • Es darf beliebig häufig verwendet werden (0 – n-mal)

  • Das optionale Attribut mode gibt die "Richtung" des Datenstroms an (in: Input-Parameter für die Datenbank; out: Ergebnisparameter aus der Datenbank; inout: sowohl Input-Parameter als auch Ergebnisparameter; Standard: in.

  • Das Attribut name gibt einen frei wählbaren Namen (NCName) für ein Parameter an.

  • Das Attribut index gibt einen ganzzahligen Platzhalterindex für den in Attribut name definierten Parameter an.

  • Das optionale Attribut type gibt den Datentyp an (z. B. INTEGER oder BLOB; Standard: VARCHAR).

  • Das optionale Attribut timezone gibt eine Zeitzone gemäß java.util.TimeZone, siehe http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TimeZone.html, an, z. B. GMT+2.

  • Das optionale Attribut format gibt ein Datumsformat gemäß java.text.SimpleDateFormat an.

Für jedes Element <rowset/> gilt:

  • Es darf beliebig häufig verwendet werden (0n-mal)

  • Es enthält beliebig viele Elemente <row/>, welche die Statement-Ausführung steuern.

Für jedes Element <row/> gilt:

  • Es darf beliebig viele Elemente enthalten, die den Namen der Tabellenspalte oder den im SQL-Statement gesetzten Spalten-Alias tragen.

  • Die darin liegenden Elemente enthalten die jeweiligen Werte.

Beachten Sie Folgendes

  • Die Attribute mode und format sind in X4 Server Revision 31469 Pflichtparameter; ab neueren Versionen sind diese optional.

  • Zulässige Datentypen für das Attribut type zum Setzen (Input-Parameter) und Lesen (ResultSet) von Werten sind: BIGINT, BINARY, BIT, BOOLEAN, BLOB, CHAR, CLOB, DATE, DECIMAL, DOUBLE, FLOAT, INTEGER, LONGNVARCHAR, LONGVARBINARY, LONGVARCHAR, NCHAR, NCLOB, NULL, NUMERIC, NVARCHAR, REAL, SMALLINT, SQLXML, TIME, TIMESTAMP, TINYINT, VARBINARY und VARCHAR (Standard), XML (alias für SQLXML).

Beispiel

<Rootelement>
   <preparedstatementbatch resulttag="Ergebniselementname" timezone="MEZ"
      format="dd.MM.yyyy">
      <sql>  
      <![CDATA[ UPDATE PROCESS SET X4_VERSION=4 WHERE X4_DURATION=? ]]>
      </sql>
      <columns>
         <column mode="in" name="id" index="1"
            type="INTEGER">
         </column>
      </columns>
      <rowset>
         <row>
            <id>23</id>
         </row>
         <row>
            <id>25</id>
         </row>
      </rowset>
   </preparedstatementbatch>
</Rootelement>

Output

Wurde die Batch-Anweisung erfolgreich ausgeführt, gibt der Datenbankverbindungs-Baustein folgende XML-Struktur zurück:

<Data>
   <Ergebniselementname>
      <!--Status der Batch-Operation-->
   </Ergebniselementname>
</Data>

Als Status der Batch-Operation sind folgende Ausgaben möglich:

  • (Anzahl der Zeilen) rows affected. oder

  • SUCCESS_NO_INFO oder

  • EXECUTE_FAILED