Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

PREPARE - Dynamisch formulierte Anweisungen vorbereiten

PREPARE bereitet eine dynamisch formulierte Anweisung oder die Cursorbeschreibung eines dynamischen Cursors für die spätere Ausführung vor.

Eine mit PREPARE vorbereitete Anweisung wird mit EXECUTE ausgeführt.

Ein bei PREPARE verwendeter Anweisungsbezeichner für eine Cursorbeschreibung wird zur Vereinbarung eines dynamischen Cursors mit DECLARE CURSOR verwendet. Der dynamische Cursor wird mit OPEN geöffnet.



PREPARE anweisungsbezeichner FROM anweisungsvariable

anweisungsvariable ::= : benutzervariable



anweisungsbezeichner

Name der dynamisch formulierten Anweisung bzw. Cursorbeschreibung. Mit diesem Namen ist die Anweisung bzw. die Cursorbeschreibung in der Übersetzungseinheit ansprechbar.


anweisungsvariable

Alphanumerische Benutzervariable, die den Anweisungstext enthält. Für Benutzervariable ist auch ein Datentyp CHAR(n) zulässig, mit 256 <= n <= 32000.

Folgende Bedingungen müssen erfüllt sein:

      • Innerhalb des Anweisungstexts dürfen keine Benutzervariablen verwendet werden. Platzhalter für noch unbekannte Eingabewerte werden durch ein Fragezeichen angegeben (siehe auch Abschnitt „Regeln für Platzhalter"). Die Platzhalter werden über die USING-Klausel einer EXECUTE- bzw. OPEN-Anweisung mit Werten versorgt.

      • Der Anweisungstext darf keine Kommentare der Wirtssprache enthalten. Ausnahmen sind Pragmas (--%PRAGMA).

      • Eine SELECT-Anweisung darf keine INTO-Klausel enthalten.

      • Bei einer INSERT-Anweisung darf die RETURN INTO-Klausel nicht angegeben werden. Um die von statischen INSERT-Anweisungen bekannte Funktionalität nutzen zu können, steht der CLI-Aufruf SQL_DIAG SEQ_GET zur Verfügung. Damit kann RETURN INTO nachgebildet werden (siehe "SQL_DIAG_SEQ_GET - SQLdsg").

Ist anweisungsbezeichner für einen dynamischen Cursor definiert, die Anweisung aber keine Cursorbeschreibung, wird ein Fehler gemeldet. Die Anweisung wird trotzdem erfolgreich vorbereitet und kann mit EXECUTE ausgeführt werden.

Regeln für Platzhalter

Ein Platzhalter für einen Eingabewert in einer dynamisch formulierten Anweisung wird durch ein Fragezeichen dargestellt. Die Angabe eines Platzhalters ist erlaubt, wenn die mit dem Platzhalter verbundenen Operanden bzw. Operatoren den Datentyp des Platzhalters eindeutig festlegen.

Die erlaubten bzw. nicht erlaubten Positionen für Platzhalter sind im Folgenden nach der Stelligkeit der Operatoren sowie für CASE-Ausdruck, CAST-Ausdruck, numerische Funktionen, Zeichenkettenfunktionen, SELECT-Liste, INSERT, UPDATE und MERGE zusammengestellt. Bei den erlaubten Platzhaltern ist auch jeweils der Datentyp des Platzhalters angegeben.

Ist auf einer Position ein Platzhalter nicht erlaubt, dann gilt dies auch, wenn der Platzhalter in Klammern eingeschlossen wird.

Beispiel

nicht erlaubt: (?)+(?)

Einstelliger Operator

Bei einem einstelligen Operator sind keine Platzhalter erlaubt. Folgende Fälle sind daher nicht erlaubt:

      • Der Operand eines einstelligen Operators darf kein Platzhalter sein (z.B. -?).

      • Der Operand bei IS [NOT] NULL darf kein Platzhalter sein (z.B. ? IS NULL).

      • Das Argument einer Mengenfunktion darf kein Platzhalter sein (z.B. AVG(?)).

Zweistelliger Operator

Bei einem zweistelligen Operator darf nur einer der beiden Operanden ein Platzhalter sein.

Beispiel

erlaubt: ?+1, ?<100, p=?

nicht erlaubt: ?=?


Datentyp des Platzhalters

Wenn bei der Konkatenation ein Operand ein Platzhalter (?||'...' bzw. '...'||?) ist, dann ist der Datentyp des Platzhalters VARCHAR(32000) oder NVARCHAR(16000).

Bei allen anderen zweistelligen Operatoren ist der Datentyp des Platzhalters derselbe wie der Datentyp des anderen Operanden.

Bereichsabfrage

Bei einer Bereichsabfrage, in der der erste Operand ein Platzhalter ist, darf keiner der beiden anderen Operanden ein Platzhalter sein.

Beispiel

erlaubt: ? BETWEEN 100 AND 500
        50 BETWEEN ? AND ?
nicht erlaubt: ? BETWEEN 100 AND ?


Datentyp des Platzhalters

Der Datentyp des Platzhalters ergibt sich aus den Datentypen der Werte der übrigen Operanden, die keine Platzhalter sind (siehe „Datentyp des Platzhalters bei CASE, BETWEEN und IN").

Elementabfrage

Bei einer Elementabfrage dürfen nicht der erste Operand und alle Elemente der Liste Platzhalter sein.


Beispiel

erlaubt: ? IN ('Frankfurt','Muenchen','Hamburg')
         x IN (?,'Muenchen','Hamburg')
         ? IN ('Frankfurt',?,?)
         x IN (?,?,?)
         ? NOT IN (SELECT anr FROM leistung WHERE ltext = 'Schulung')
nicht erlaubt: ? IN (?,?,?)


Datentyp des Platzhalters

      • Ist der erste Operand ein Platzhalter und der zweite Operand eine Unterabfrage, ist der Datentyp des Platzhalters derselbe wie der Datentyp der Ergebnisspalte.

      • Ist der erste Operand ein Platzhalter und der zweite Operand eine Liste von Ausdrücken, dann ergibt sich der Datentyp des Platzhalters aus den Datentypen der Elemente der Liste, die keine Platzhalter sind (siehe „Datentyp des Platzhalters bei CASE, BETWEEN und IN").

      • Ist ein Element der Liste ein Platzhalter und der erste Operand kein Platzhalter, ist der Datentyp des Platzhalters derselbe wie der Datentyp des ersten Operanden.

Mustervergleich

Bei einem Mustervergleich dürfen der zweite und dritte Operand Platzhalter sein.


Beispiel

erlaubt: x LIKE ? ESCAPE ?

nicht erlaubt: ? LIKE y ESCAPE ?


Datentyp des Platzhalters

Der Datentyp des Platzhalters ist VARCHAR(32000) oder NVARCHAR(16000).

CASE-Ausdruck

In einem CASE-Ausdruck dürfen nicht alle Operanden Platzhalter sein. Enthält der CASE-Ausdruck eine oder mehrere THEN- bzw. ELSE-Klauseln, dürfen zusätzlich nicht alle Operanden dieser Klauseln Platzhalter sein. Folgende Fälle sind daher nicht erlaubt:

      • In einem einfachen CASE-Ausdruck ist der erste Operand (Ausdruck nach CASE) ein Platzhalter und der Operand in der WHEN-Klausel ist ein Platzhalter bzw. - wenn es mehrere WHEN-Klauseln gibt - alle Operanden in den WHEN-Klauseln sind Platzhalter.

      • In einem einfachen CASE-Ausdruck enthalten alle THEN-Klauseln und die ELSE-Klausel Platzhalter.

        Beispiel

        erlaubt: CASE ?
                  WHEN 1 THEN 10
                  WHEN 2 THEN 20
                  WHEN ? THEN 30
                  WHEN ? THEN 30
                  ELSE 50 END
        nicht erlaubt: CASE ?
                        WHEN ? THEN 10
                        WHEN ? THEN 20
                        WHEN ? THEN 30
                        WHEN ? THEN 30
                        ELSE 50 END
        nicht erlaubt: CASE x
                        WHEN 1 THEN ?
                        WHEN 2 THEN ?
                        ELSE ? END
        
    • In einem CASE-Ausdruck mit Suchbedingung enthalten alle THEN-Klauseln und die ELSE-Klausel Platzhalter.

      erlaubt: CASE
               WHEN astnr= 1 THEN ?
               WHEN astnr= 2 THEN ?
               WHEN astnr > 2 AND astnr < 5 THEN ?
               ELSE 50 END
      nicht erlaubt: CASE
                     WHEN astnr= 1 THEN ?
                     WHEN astnr= 2 THEN ?
                     WHEN astnr > 2 AND astnr < 5 THEN ?
                     ELSE ? END
      
    • In einem CASE-Ausdruck mit NULLIF sind beide Operanden Platzhalter (z.B. NULLIF (?,?))

    • In einem CASE-Ausdruck mit COALESCE sind alle Operanden Platzhalter (z.B. COALESCE (?,?,?))


Datentyp des Platzhalters

Der Datentyp des Platzhalters in einem CASE-Ausdruck ist abhängig von den Datentypen der übrigen Operanden, die keine Platzhalter sind.

Ist ein Operand eines CASE-Ausdrucks mit NULLIF ein Platzhalter, so entspricht sein Datentyp dem Datentyp des anderen Operanden.

Sind mehrere der übrigen Operanden ohne Platzhalter, gelten folgende Regeln:

    • Ist der erste Operand eines einfachen CASE-Ausdrucks ein Platzhalter und/oder enthält der CASE-Ausdruck in der/den WHEN-Klausel(n) Platzhalter als Operand(en), so ergibt sich ihr Datentyp aus den Datentypen der übrigen Operanden, die keine Platzhalter sind und die nicht Operanden der THEN- bzw. ELSE-Klausel(n) sind.

    • Enthält ein CASE-Ausdruck mit Suchbedingung oder ein einfacher CASE-Ausdruck Platzhalter in der/den THEN-Klausel(n) und/oder der ELSE-Klausel, so ergibt sich ihr Datentyp aus den Datentypen der übrigen THEN- bzw. ELSE-Klausel-Operanden, die keine Platzhalter sind.

    • Ist ein Operand eines CASE-Ausdrucks mit COALESCE ein Platzhalter, so ergibt sich sein Datentyp aus den Datentypen der übrigen Operanden, die keine Platzhalter sind.

Für die Berechnung des jeweiligen Platzhalter-Datentyps gelten die Regeln, die im Abschnitt „Datentyp des Platzhalters bei CASE, BETWEEN und IN" beschrieben sind.

CAST-Ausdruck

Keine Einschränkungen


Datentyp des Platzhalters

Der Datentyp des Platzhalters in einem CAST-Ausdruck entspricht dem Datentyp des Ergebniswertes des CAST-Ausdrucks.

Numerische Funktionen

Bei der numerischen Funktion POSITION dürfen nicht beide Operanden Platzhalter sein (z.B. POSITION (? IN ?)).

Datentyp des Platzhalters

Der Datentyp des Platzhalters bei den numerischen Funktionen POSITION, OCTET_LENGTH und CHAR_LENGTH ist VARCHAR(32000) oder NVARCHAR(16000).

Der Datentyp des Platzhalters bei der numerischen Funktion JULIAN_DAY_OF_DATE ist DATE.

Zeichenkettenfunktionen

Bei Zeichenkettenfunktionen sind folgende Fälle nicht erlaubt:

    • Bei den Zeichenkettenfunktionen LOWER und UPPER dürfen die Operanden keine Platzhalter sein

    • Bei der Zeichenkettenfunktion TRIM dürfen der erste Operand (zeichen) und/oder der zweite Operand (ausdruck) keine Platzhalter sein (z.B. TRIM (TRAILING FROM ?))

    • Bei der Zeichenkettenfunktion SUBSTRING darf der erste Operand kein Platzhalter sein (z.B. SUBSTRING ? FROM 1 FOR 5))


Datentyp des Platzhalters

Bei der Zeichenkettenfunktion SUBSTRING ist der Datentyp des Platzhalters NUMERIC(31,0).

Zeitfunktionen

Keine Einschränkungen


Datentyp des Platzhalters

Bei der Zeitfunktion DATE_OF_JULIAN_DAY ist der Datentyp des Platzhalters INTEGER.

SELECT-Liste

Bei einem SELECT-Ausdruck darf ein Element der SELECT-Liste nicht nur aus einem Platzhalter bestehen.


Beispiel

erlaubt: SELECT 3+? FROM ...

nicht erlaubt: SELECT ?,x,p FROM ...

INSERT, UPDATE, MERGE

Als Spaltenwert für eine einfache Spalte und für ein Element einer multiplen Spalte kann ein Platzhalter angegeben werden.


Beispiel

erlaubt:  INSERT INTO tab (x, ...) VALUES (?, ...)
          INSERT INTO t (x) VALUES <..., ?, ...>
          UPDATE tab SET x=?
          UPDATE t SET x=<..., ?, ...>


Datentyp des Platzhalters

Der Datentyp des Platzhalters ist der Datentyp der Spalte. Bei einer multiplen Spalte mit Dimension > 1 ist der Platzhalter auch multipel mit derselben Dimension. Ansonsten ist der Platzhalter einfach.

Datentyp des Platzhalters bei CASE, BETWEEN und IN

Bei CASE-Ausdrücken sowie bei Bereichs- und Elementabfragen ergibt sich in einigen Fällen der Datentyp des Platzhalters aus den Datentypen der übrigen Operanden bzw. Elemente, die keine Platzhalter sind. In diesen Fällen gelten folgende Regeln:

    • Alle Werte der übrigen Operanden haben Datentyp CHAR:
      Der Wert des Platzhalters hat Datentyp CHAR mit der größten Länge.

    • Mindestens ein Wert der übrigen Operanden hat Datentyp VARCHAR:Der Wert des Platzhalters hat Datentyp VARCHAR mit der größten bzw. größten maximalen Länge.

    • Alle Werte der übrigen Operanden haben Datentyp NCHAR:
      Der Wert des Platzhalters hat Datentyp NCHAR mit der größten Länge.

    • Mindestens ein Wert der übrigen Operanden hat Datentyp NVARCHAR:Der Wert des Platzhalters hat Datentyp NVARCHAR mit der größten bzw. größten maximalen Länge.

    • Alle Werte der übrigen Operanden haben ganzzahligen Typ oder Festpunktzahl-Typ (INT, SMALLINT, NUMERIC, DEC):
      Der Wert des Platzhalters hat Datentyp Ganz- oder Festpunktzahl.

      • Die Nachkommastellenzahl ist die größte der Nachkommastellenzahlen der verschiedenen Werte der übrigen Operanden.

      • Die Gesamtstellenzahl ist die größte der Vorkommastellenzahlen plus die größte der Nachkommastellenzahlen der verschiedenen Werte der übrigen Operanden, höchstens jedoch 31.

    • Mindestens ein Wert der übrigen Operanden hat Gleitpunktzahl-Typ (REAL, DOUBLE PRECISION, FLOAT), die anderen haben einen beliebigen numerischen Datentyp:Der Wert des Platzhalters hat den Datentyp DOUBLE PRECISION.

    • Alle Werte der übrigen Operanden haben Zeitdatentyp:
      Der Wert des Platzhalters hat auch diesen Datentyp.


Umwandlung des Platzhalter-Datentyps durch CAST

Die Regeln für Platzhalter ergeben manchmal unerwünschte Datentypen für einen Platzhalter. Unerwünschte Datentypen können Sie mit Hilfe des CAST-Ausdrucks vermeiden (siehe Abschnitt „CAST-Ausdruck").


Beispiel

In der folgenden dynamisch formulierten UPDATE-Anweisung steht der Platzhalter für eine einstellige Ganzzahl:

UPDATE t SET x=?+1

Wird dann für den Platzhalter in der USING-Klausel der EXECUTE-Anweisung der Wert 10 angegeben, ist die Ausführung nicht erfolgreich.

Um diese Datentypzuordnung zu vermeiden, kann die UPDATE-Anweisung wie folgt formuliert werden:

UPDATE t SET x=CAST(? AS DEC(5,0))

Prozeduren

Eine Prozedur kann über eine dynamisch formulierte CALL-Anweisung aufgerufen werden. Wenn eine Prozedur Parameter vom Typ OUT oder INOUT enthält, dann müssen in einer dynamisch formulierten CALL-Anweisung die korrespondierenden Argumente in Form von Platzhaltern angegeben werden.

Anweisungen für PREPARE

Folgende SQL-Anweisungen können mit PREPARE vorbereitet werden:

ALTER SPACE

ALTER STOGROUP

ALTER TABLE

CALL

COMMIT

CREATE INDEX

CREATE FUNCTION

CREATE PROCEDURE

CREATE SCHEMA

CREATE SPACE

CREATE STOGROUP

CREATE SYSTEM_USER

CREATE TABLE

CREATE USER

CREATE VIEW

DELETE

DROP FUNCTION

DROP INDEX

DROP PROCEDURE

DROP SCHEMA

DROP SPACE

DROP STOGROUP

DROP SYSTEM_USER

DROP TABLE

DROP USER

DROP VIEW

GRANT

INSERT (ohne RETURN INTO-Klausel)

MERGE

PERMIT

REORG STATISTICS

REVOKE

ROLLBACK

SELECT (ohne INTO-Klausel)

SET CATALOG

SET SCHEMA

SET SESSION AUTHORIZATION

SET TRANSACTION

UPDATE


Außer diesen SQL-Anweisungen können dynamisch formulierte Cursorbeschreibungen sowie alle Utility-Anweisungen mit PREPARE vorbereitet werden (siehe Handbuch „ SQL-Sprachbeschreibung Teil 2: Utilities“).


Folgende Anweisungen können nicht mit PREPARE vorbereitet werden:

ALLOCATE DESCRIPTOR

CLOSE

DEALLOCATE DESCRIPTOR

DECLARE CURSOR

DESCRIBE

EXECUTE

EXECUTE IMMEDIATE

FETCH

GET DESCRIPTOR

INCLUDE

OPEN

PREPARE

RESTORE

SET DESCRIPTOR

STORE

WHENEVER

Gültigkeitsdauer einer vorbereiteten Anweisung

Eine mit PREPARE vorbereitete SQL-Anweisung bleibt mindestens bis zum Ende der aktuellen Transaktion für die Ausführung vorbereitet. Nach Ende der Transaktion sollten Sie die Anweisung erneut vorbereiten. Enthält der Planpuffer des DBH noch den Zugriffsplan der in anweisungsvariable enthaltenen SQL-Anweisung, verwendet SESAM/SQL den bereits existierenden Zugriffsplan erneut.

Eine mit PREPARE vorbereitete Anweisung geht verloren, wenn PREPARE mit demselben anweisungsbezeichner in derselben Übersetzungseinheit und SQL-Session ausgeführt wird.

Die vorbereitete Anweisung geht auch verloren, wenn die Anweisung eine Referenz auf einen dynamischen Cursor enthält und die für diesen Cursor vorbereitete Cursorbeschreibung verloren geht.


Beispiel

Das Beispiel bereitet die Cursorbeschreibung des dynamischen Cursor CUR_LEISTUNG1 für die spätere Ausführung vor. Der Inhalt der Benutzer-Variable BESCHREIBUNG wird bearbeitet mit Aktionen der Wirtssprache des ESQL-Programms.

DECLARE cur_leistung1 CURSOR FOR curbeschreibung

PREPARE curbeschreibung FROM :BESCHREIBUNG

Siehe auch

DECLARE CURSOR, EXECUTE, FETCH, OPEN