Ermitteln von Datentypen nicht typisierter Ausdrücke
Ein nicht typisierter Ausdruck bezieht sich auf die Verwendung einer Parametermarke, die ohne zugeordneten Zieldatentyp angegeben wird, einen Nullwert, der ohne zugeordneten Zieldatentyp angegeben wird, oder ein Schlüsselwort DEFAULT.
- Eine Anweisung PREPARE wird von einer CLI-oder JDBC -Anwendung ausgeführt, um die SQL-Anweisung zu kompilieren; die Clientschnittstelle verwendet verzögerte Vorbereitung und die Registrierdatenbankvariable DB2_DEFERRED_PREPARE_SEMANTICS ist auf YES gesetzt. In diesem Fall leitet jede nicht typisierte Parametermarke ihren Datentyp basierend auf dem Eingabedeskriptor ab, der der nachfolgenden Anweisung OPEN oder EXECUTE zugeordnet ist. Das Längenattribut wird gemäß der UNTYPED-Zeile auf die maximale Länge gesetzt, wie in Tabelle 2 in
Funktionen
beschrieben, und die Länge, wie aus den folgenden Tabellen bestimmt. Für Datentypen, die nicht als Zieltyp in Tabelle 2 inFunktionen
aufgelistet sind, wird die Länge aus dem Eingabedeskriptor, der der nachfolgenden Anweisung OPEN oder EXECUTE zugeordnet ist, verwendet. Die Datentypen und Längen können abhängig von der Verwendung der nicht typisierten Parametermarke in der SQL-Anweisung geändert werden. - Der Datentyp kann basierend auf dem Kontext in der SQL-Anweisung bestimmt werden. Diese Positionen und die resultierenden Datentypen werden in der folgenden Tabelle angezeigt. Die Positionen werden in Ausdrücken, Vergleichselementen, integrierten Funktionen und benutzerdefinierten Routinen gruppiert, um die Anwendbarkeit eines nicht typisierten Ausdrucks zu ermitteln. Wenn der Datentyp nicht basierend auf dem Kontext bestimmt werden kann, wird ein Fehler ausgegeben.
In einigen Fällen, die nicht aufgelistet sind, werden nicht typisierte Ausdrücke in einer Auswahlliste in einen Datentyp aufgelöst, der auf der Basis der Verwendung in der SQL-Anweisung bestimmt wird.
Die Codepage des nicht typisierten Ausdrucks wird durch den Kontext bestimmt. Wenn kein Kontext vorhanden ist, ist die Codepage so, als wäre der nicht typisierte Ausdruck in einen VARCHAR-Datentyp umgesetzt worden.
Die folgenden Tabellen zeigen Zeichenfolgedatentypen und Grafikzeichenfolgedatentypen in Zeichenfolgeeinheiten, die einer Datenbankumgebung zugeordnet sind, in der der Standardwert für Zeichenfolgeeinheiten SYSTEM ist. Wenn in der Unicode-Datenbankumgebung die Zeichenfolgeeinheiten auf CODEUNITS32gesetzt sind, sollten alle Längenattribute für Zeichenfolgen oder Grafikzeichenfolgen, die die maximale Länge des Datentyps darstellen, berücksichtigt werden, um das Maximum des Datentyps in CODEUNITS32darzustellen. Alle Zeichenfolgedatentypen oder Grafikzeichenfolgedatentypen haben die Standardzeichenfolgeeinheiten der Datenbankumgebung.
| Position des nicht typisierten Ausdrucks | Datentyp |
|---|---|
| Alleine in einer Auswahlliste | Wenn der nicht typisierte Ausdruck nicht benannt oder benannt ist, aber nachfolgend nicht in der SQL-Anweisung referenziert wird, wird ein Fehler zurückgegeben, es sei denn, der nicht typisierte Ausdruck ist der Nullwert. In solchen Fällen ist der Datentyp VARCHAR (1). Wenn der nicht typisierte Ausdruck benannt und anschließend in der SQL-Anweisung referenziert wird, kann der Datentyp aus der nachfolgenden Verwendung bestimmt werden. Weitere Informationen finden Sie im Hinweis "Determining data type from usage" im Anschluss an diese Tabelle. |
| Beide Operanden eines einzelnen arithmetischen Operators, nachdem die Rangfolge der Operatoren und die Reihenfolge der Operationsregeln berücksichtigt wurden Schließt Fälle wie die folgenden ein:
|
DECFLOAT (34) |
| Ein Operand eines einzelnen Operators in einem arithmetischen Ausdruck (kein Ausdruck für Datum und Uhrzeit) Schließt Fälle wie die folgenden ein:
|
Der Datentyp des anderen Operanden. |
| Gekennzeichnete Dauer innerhalb eines Datums-/Uhrzeitausdrucks (beachten Sie, dass der Teil einer gekennzeichneten Dauer, der den Typ von Einheiten angibt, keine Parametermarke sein kann) | DEZIMAL (15, 0) |
| Jeder andere Operand eines Datums-/Uhrzeitausdrucks (z. B. 'timecol +?' oder '? -datecol ') | Fehler |
| Beide Operanden eines Operators CONCAT | VARCHAR (254) |
| Ein Operand eines Operators CONCAT, wenn der andere Operand ein Nicht-CLOB-Zeichendatentyp ist | Wenn ein Operand entweder CHAR (n) oder VARCHAR (n) ist, wobei n kleiner als 128 ist, ist der andere VARCHAR (254- n); in allen anderen Fällen ist der Datentyp VARCHAR (254). |
| Ein Operand eines Operators CONCAT, wenn der andere Operand ein binärer Nicht-BLOB-Datentyp ist | Wenn ein Operand entweder BINARY (n) oder VARBINARY (n) ist, wobei n kleiner als 128 ist, ist der andere Operand VARBINARY (254- n); in allen anderen Fällen ist der Datentyp VARBINARY (254). |
| Ein Operand eines Operators CONCAT, wenn der andere Operand ein Nicht-DBCLOB-Grafikdatentyp ist | Ist ein Operand entweder GRAPHIC (n) oder VARGRAPHIC (n), wobei n kleiner als 64 ist, ist der andere Operand VARGRAPHIC (127- n); in allen anderen Fällen ist der Datentyp VARGRAPHIC (127). |
| Ein Operand eines Operators CONCAT, wenn der andere Operand eine große Objektzeichenfolge ist | Identisch mit dem des anderen Operanden |
| Der Ausdruck nach dem Schlüsselwort CASE in einem einfachen CASE -Ausdruck. | Ergebnis der Anwendung der Regeln für die Ergebnisdatentypenauf die Ausdrücke nach dem Schlüsselwort WHEN, die keine nicht typisierten Ausdrücke sind |
| Mindestens einer der Ergebnisausdrücke in einem CASE -Ausdruck (sowohl einfach als auch durchsucht), wobei der Rest der Ergebnisausdrücke nicht typisierte Ausdrücke sind | Fehler |
| Beliebige oder alle Ausdrücke nach dem Schlüsselwort WHEN in einem einfachen CASE -Ausdruck | Ergebnis der Anwendung der Regeln für Ergebnisdatentypenauf den Ausdruck nach CASE und die Ausdrücke nach dem Schlüsselwort WHEN , die sich von einem nicht typisierten Ausdruck unterscheiden |
| Ein Ergebnisausdruck in einem Ausdruck CASE (sowohl einfach als auch durchsucht), wenn mindestens ein Ergebnisausdruck nicht ein nicht typisierter Ausdruck ist | Ergebnis der Anwendung der Regeln für Ergebnisdatentypenauf alle Ergebnisausdrücke, die nicht einen nicht typisierten Ausdruck sind |
| Alone als Spaltenausdruck in einer einzeiligen Klausel VALUES, die nicht in einer Anweisung INSERT und nicht in der Klausel VALUES der Einfügeoperation einer Anweisung MERGE enthalten ist | Fehler, wenn der nicht typisierte Ausdruck nicht benannt ist oder benannt ist, aber nachfolgend nicht in der SQL-Anweisung referenziert wird. Wenn der nicht typisierte Ausdruck benannt und anschließend in der SQL-Anweisung referenziert wird, kann der Datentyp aus der nachfolgenden Verwendung bestimmt werden. Weitere Informationen finden Sie im Hinweis "Determining data type from usage" im Anschluss an diese Tabelle. |
| Als Spaltenausdruck in einer Klausel VALUES mit mehreren Zeilen, die nicht in einer Anweisung INSERT enthalten ist und für die die Spaltenausdrücke an derselben Position in allen anderen Zeilenausdrücken nicht typisiert sind | Fehler, wenn der nicht typisierte Ausdruck nicht benannt ist oder benannt ist, aber nachfolgend nicht in der SQL-Anweisung referenziert wird. Wenn der nicht typisierte Ausdruck benannt und anschließend in der SQL-Anweisung referenziert wird, kann der Datentyp aus der nachfolgenden Verwendung bestimmt werden. Weitere Informationen finden Sie im Hinweis "Determining data type from usage" im Anschluss an diese Tabelle. |
| Allein als Spaltenausdruck in einer Klausel VALUES für mehrere Zeilen, die nicht in einer Anweisung INSERT enthalten ist und für die der Ausdruck an derselben Position mindestens eines anderen Zeilenausdrucks kein nicht typisierter Ausdruck ist. | Ergebnis der Anwendung der Regeln für Ergebnisdatentypenauf alle Operanden, die keine nicht typisierten Ausdrücke sind |
| Alone als Spaltenausdruck in einer Klausel VALUES für eine einzelne Zeile innerhalb einer Anweisung INSERT | Der Datentyp der Spalte. Wenn die Spalte als benutzerdefinierter einzigartiger Datentyp definiert ist, ist dies der Quellendatentyp des benutzerdefinierten einzigartigen Datentyps. Wenn die Spalte als benutzerdefinierter strukturierter Typ definiert ist, handelt es sich um den strukturierten Typ, der auch den Rückgabetyp der Umsetzungsfunktion angibt. |
| Alone als Spaltenausdruck in einer Klausel VALUES mit mehreren Zeilen innerhalb einer Anweisung INSERT | Der Datentyp der Spalte. Wenn die Spalte als benutzerdefinierter einzigartiger Datentyp definiert ist, ist dies der Quellendatentyp des benutzerdefinierten einzigartigen Datentyps. Wenn die Spalte als benutzerdefinierter strukturierter Typ definiert ist, handelt es sich um den strukturierten Typ, der auch den Rückgabetyp der Umsetzungsfunktion angibt. |
| Allein als Spaltenausdruck in einer Werteklausel der Quellentabelle für eine Anweisung MERGE | Fehler, wenn der nicht typisierte Ausdruck nicht benannt oder benannt ist, aber anschließend nicht in der SQL-Anweisung referenziert wird. Wenn der nicht typisierte Ausdruck benannt und anschließend in der SQL-Anweisung referenziert wird, kann der Datentyp aus der nachfolgenden Verwendung bestimmt werden. Weitere Informationen finden Sie im Hinweis "Determining data type from usage" im Anschluss an diese Tabelle. |
| Allein als Spaltenausdruck in der Klausel VALUES einer Einfügeoperation einer Anweisung MERGE | Der Datentyp der Spalte. Wenn die Spalte als benutzerdefinierter einzigartiger Datentyp definiert ist, ist dies der Quellendatentyp des benutzerdefinierten einzigartigen Datentyps. Wenn die Spalte als benutzerdefinierter strukturierter Typ definiert ist, ist dies der strukturierte Typ, der auch den Rückgabetyp der Umsetzungsfunktion angibt. |
| Allein als Spaltenausdruck auf der rechten Seite der Zuordnungsklausel für eine Aktualisierungsoperation einer Anweisung MERGE | Der Datentyp der Spalte. Wenn die Spalte als benutzerdefinierter einzigartiger Datentyp definiert ist, ist dies der Quellendatentyp des benutzerdefinierten einzigartigen Datentyps. Wenn die Spalte als benutzerdefinierter strukturierter Typ definiert ist, ist dies der strukturierte Typ, der auch den Rückgabetyp der Umsetzungsfunktion angibt. |
| Allein als Spaltenausdruck auf der rechten Seite einer SET-Klausel in einer Anweisung UPDATE | Der Datentyp der Spalte. Wenn die Spalte als benutzerdefinierter einzigartiger Datentyp definiert ist, ist dies der Quellendatentyp des benutzerdefinierten einzigartigen Datentyps. Wenn die Spalte als benutzerdefinierter strukturierter Typ definiert ist, ist dies der strukturierte Typ, der auch den Rückgabetyp der Umsetzungsfunktion angibt. |
| Als Wert auf der rechten Seite einer Anweisung SET für Sonderregister | Der Datentyp des Sonderregisters. |
| Argument der Klausel TABLESAMPLE der Klausel tablesample eines Tabellenverweises | DOPPELT |
| Argument der Unterklausel REPEATABLE der tablesample-Klausel eines Tabellenverweises | INTEGER |
| Alone als fetch-row-count in einer fetch-Klausel | BIGINT |
| Alone als Offset-Zeilenanzahl in einer OFFSET-Klausel | BIGINT |
| Als Wert in einer Anweisung FREE LOCATOR | Querverweis |
| Als Wert für das Kennwort in einer Anweisung SET ENCRYPTION PASSWORD | VARCHAR(128) |
- Datentyp anhand der Nutzung ermitteln
- Das folgende Beispiel zeigt, wie der Datentyp für einen nicht typisierten Ausdruck durch nachfolgende Verwendung bestimmt werden kann:
Wenn der benannte nicht typisierte Ausdruck anschließend in einem Vergleichsoperator referenziert wird, hat er den Datentyp des anderen Operanden. Wenn mehrere Referenzen des benannten nicht typisierten Ausdrucks in der SQL-Anweisung vorhanden sind, muss der Datentyp, die Länge, die Genauigkeit, die Anzahl der Kommastellen und die Codepage, die unabhängig für jede dieser Referenzen bestimmt werden, identisch sein oder ein Fehler zurückgegeben werden.
| Position des nicht typisierten Ausdrucks | Datentyp |
|---|---|
| Beide Operanden eines Vergleichsoperators | VARCHAR (254) |
| Ein Operand eines Vergleichsoperators, wenn der andere Operand ein anderer als ein nicht typisierter Ausdruck ist | Der Datentyp des anderen Operanden. |
| Alle Operanden eines Vergleichselements BETWEEN | VARCHAR (254) |
| Zwei Operanden eines Vergleichselements BETWEEEN | Identisch mit dem einzigen typisierten Ausdruck |
| Nur ein Operand eines Prädikats BETWEEN | Ergebnis der Anwendung der Regeln für Ergebnisdatentypenauf alle Operanden, die keine nicht typisierten Ausdrücke sind |
| Alle Operanden eines IN-Vergleichselements, z. B.? IN (?,?,?) | VARCHAR (254) |
| Der erste Operand eines IN-Vergleichselements, wenn die rechte Seite ein Fullselect ist, z. B. IN (Fullselect). | Datentyp der ausgewählten Spalte |
| Der erste Operand eines IN-Vergleichselements, wenn die rechte Seite keine Unterauswahl ist. Beispiel:? IN (?, A, B) oder? IN (A,?, B,?) | Ergebnis der Anwendung der "Regeln für Ergebnisdatentypen" auf allen Operanden der IN-Liste (Operanden rechts neben dem Schlüsselwort IN), die keine nicht typisierten Ausdrücke sind |
| Beliebige oder alle Operanden der IN-Liste des IN-Vergleichselements, z. B. A IN (?, B,?) | Ergebnis der Anwendung der "Regeln für Ergebnisdatentypen" auf alle Operanden des Vergleichselements IN (Operanden links und rechts neben dem Schlüsselwort IN), die keine nicht typisierten Ausdrücke sind |
| Sowohl der Operand in einem Zeilenwertausdruck eines IN-Vergleichselements als auch die entsprechende Ergebnisspalte des Fullselect, z. B. (c1,?) IN (SELECT c1,? VON ...) | VARCHAR (254) |
| Alle Operanden in einem Zeilenwertausdruck eines IN-Vergleichselements, z. B. (c1,?) IN Fullselect | Datentyp der entsprechenden Ergebnisspalte des Fullselects |
| Alle Auswahllistenelemente in einer Unterabfrage, wenn ein Zeilenwertausdruck in einem IN-Vergleichselement angegeben ist, z. B. (c1,c2) IN (SELECT?, c1, VON...) | Datentyp des entsprechenden Operanden im Zeilenwertausdruck |
| Alle drei Operanden des Prädikats LIKE | Abgleichausdruck (Operand 1) und Musterausdruck (Operand 2) sind VARCHAR (32672); Escapeausdruck (Operand 3) ist VARCHAR (2). |
| Der Abgleichausdruck des Vergleichselements LIKE, wenn entweder der Musterausdruck oder der Escapeausdruck ein anderer als ein nicht typisierter Ausdruck ist. | VARCHAR (32672), VARBINARY (32672) oder VARGRAPHIC (16336), abhängig vom Datentyp des ersten Operanden, der kein nicht typisierter Ausdruck ist. |
| Der Musterausdruck des Vergleichselements LIKE, wenn entweder der Abgleichausdruck oder der Escapeausdruck ein anderer als ein nicht typisierter Ausdruck ist. | VARCHAR (32672), VARBINARY (32672) oder VARGRAPHIC (16336), abhängig vom Datentyp des ersten Operanden, der kein nicht typisierter Ausdruckist |
| Der Escapeausdruck des Prädikats LIKE, wenn entweder der Abgleichausdruck oder der Musterausdruck ein anderer als ein nicht typisierter Ausdruck ist. | VARCHAR (2), VARBINARY (1) oder VARGRAPHIC (1), abhängig vom Datentyp des ersten Operanden, der kein nicht typisierter Ausdruckist |
| Operand des Prädikats NULL | VARCHAR (254) |
| Position der Markierung für nicht typisierte Parameter | Datentyp |
|---|---|
| Array-Index eines ARRAY | BIGINT |
| Alle Argumente von COALESCE, wenn alle Argumente nicht typisierte Parametermarken sind | Fehler |
| Jedes Argument von COALESCE, wenn mindestens ein Argument keine nicht typisierte Parametermarke ist | Ergebnis der Anwendung der Regeln für Ergebnisdatentypenauf alle Argumente, die keine nicht typisierten Parametermarken sind |
| Erstes Argument von DAYNAME | TIMESTAMP (12) |
| Das Argument von DIGITS | DECIMAL (31, 6) |
| Erstes Argument von FROM_UTC_TIMESTAMP | TIMESTAMP(6) |
| Alle Argumente von MAX, MIN oder NULLIF, wenn alle Argumente nicht typisierte Parametermarken sind | Fehler |
| Jedes Argument von MAX, MIN oder NULLIF, wenn mindestens ein Argument keine nicht typisierte Parametermarke ist | Ergebnis der Anwendung der Regeln für Ergebnisdatentypenauf alle Argumente, die keine nicht typisierten Parametermarken sind |
| Erstes Argument von MONTHNAME | TIMESTAMP (12) |
| POSSTR (beide Argumente) | Beide Argumente sind VARCHAR (32672) |
| POSSTR (ein Argument, wenn das andere Argument ein Zeichendatentyp ist) | VARCHAR(32672) |
| POSSTR (ein Argument, wenn das andere Argument ein Grafikdatentyp ist) | VARGRAFIK (16336) |
| POSSTR (das Argument für die Suchzeichenfolge, wenn das andere Argument ein Binärdatentyp ist) | VARBINÄR (32672) |
| Erstes und zweites Argument von REGEXP_LIKE, REGEXP_INSTR, REGEXP_SUBSTR, REGEXP_COUNT | VARCHAR(32672) |
| Erstes Argument von REGEXP_LIKE, REGEXP_INSTR, REGEXP_SUBSTR oder REGEXP_COUNT, wenn das zweite Argument kein nicht typisierter Ausdruck ist | VARGRAPHIC (16336), wenn das zweite Argument ein Grafikdatentyp ist; andernfalls VARCHAR (32672) |
| Zweites Argument von REGEXP_LIKE, REGEXP_INSTR, REGEXP_SUBSTR oder REGEXP_COUNT, wenn das erste Argument kein nicht typisierter Ausdruck ist. | VARGRAPHIC (16336), wenn das erste Argument ein Grafikdatentyp in einer Unicode-Datenbank ist; andernfalls VARCHAR (32672) |
| Erste drei Argumente von REGEXP_REPLACE | VARCHAR(32672) |
| Erstes Argument von REGEXP_REPLACE, wenn zweites oder drittes Argument kein nicht typisierter Ausdruck ist | VARGRAPHIC (16336), wenn das dritte Argument ein Grafikdatentyp oder ein drittes Argument ein nicht typisierter Ausdruck ist und das zweite Argument ein Grafikdatentyp ist; andernfalls VARCHAR (32672) |
| Zweites Argument von REGEXP_REPLACE, wenn erstes oder drittes Argument kein nicht typisierter Ausdruck ist | VARGRAPHIC (16336), wenn das erste Argument ein Grafikdatentyp in einer Unicode-Datenbank ist; andernfalls VARCHAR (32672) |
| Drittes Argument von REGEXP_REPLACE, wenn das erste oder zweite Argument kein nicht typisierter Ausdruck ist | VARGRAPHIC (16336), wenn das erste Argument ein Grafikdatentyp ist oder das erste Argument ein nicht typisierter Ausdruck ist und das zweite Argument ein Grafikdatentyp ist; andernfalls VARCHAR (32672) |
| Erstes Argument von SUBSTR | VARCHAR(32672) |
| Zweites und drittes Argument von SUBSTR | INTEGER |
| Erstes Argument von SUBSTRB | VARCHAR(32672) |
| Erstes Argument von SUBSTR2 | VARGRAPHIC (16336), wenn die Datenbank Grafiktypen unterstützt; andernfalls VARCHAR (32672) |
| Erstes Argument von SUBSTR4 | VARCHAR(32672) |
| Zweites Argument von TIMESTAMP | ZEIT |
| Erstes Argument von TIMESTAMP_FORMAT | VARCHAR (254 ) |
| Erstes Argument von TIMEZONE | TIMESTAMP(6) |
| Erstes Argument von TO_UTC_TIMESTAMP | TIMESTAMP(6) |
| Zweites und drittes Argument von TRANSLATE | VARCHAR (32672), wenn das erste Argument ein Zeichentyp ist; VARGRAPHIC (16336), wenn das erste Argument ein Grafiktyp ist. |
| Viertes Argument von TRANSLATE | VARCHAR (1), wenn das erste Argument ein Zeichentyp ist; VARGRAPHIC (1), wenn das erste Argument ein Grafiktyp ist |
| Zweites Argument von TRIM_ARRAY | BIGINT |
| Unäres Minus | DECFLOAT (34) |
| Monadischer Pluszeichen | DECFLOAT (34) |
| Alle Argumente von VALUE, wenn alle Argumente nicht typisierte Parametermarken sind | Fehler |
| Jedes Argument von VALUE, wenn mindestens ein Argument keine nicht typisierte Parametermarke ist | Ergebnis der Anwendung der Regeln für Ergebnisdatentypenauf alle Argumente, die keine nicht typisierten Parametermarken sind |
| Erstes Argument von VARCHAR_FORMAT | TIMESTAMP (12) |
| Erstes Argument von XMLCOMMENT | VARCHAR(32672) |
| Alle Argumente von XMLCONCAT | XML |
| Erstes Argument von XMLDOCUMENT | XML |
| Argumente von XMLELEMENT oder XMLEXISTS | Fehler |
| Zweites Argument von XMLPI | VARCHAR(32672) |
| Argumente von XMLQUERY | Fehler |
| Erstes Argument von XML-serialize | XML |
| Argumente von XMLTABLE | Fehler |
| Erstes Argument von XMLTEXT | VARCHAR(32672) |
| Erstes Argument von XMLVALIDATE | XML |
| Erstes Argument von XMLXSROBJECTID | XML |
| Argumente einer Aggregatfunktion | Fehler |
| Alle anderen Argumente aller anderen Skalarfunktionen | Der Datentyp des Parameters der Funktionsdefinition, wie durch die Funktionsauflösung bestimmt. Die Länge des Arguments wird basierend auf Tabelle 2 im Abschnitt 'Funktionsauflösung' abgeleitet. |
| Position der Markierung für nicht typisierte Parameter | Datentyp |
|---|---|
| Argument einer Funktion | Der Datentyp und die Länge des Parameters, wie beim Erstellen der Funktion definiert. |
| Argument einer Methode | Fehler |
| Argument einer Prozedur | Der Datentyp des Parameters, wie bei der Erstellung der Prozedur definiert |