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.
|
Siehe auch
DECLARE CURSOR, EXECUTE, FETCH, OPEN