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.

Nicht typisierte Ausdrücke können in SQL-Anweisungen verwendet werden, sofern eine der folgenden Bedingungen zutrifft:
  • 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 in Funktionenaufgelistet 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.

Tabelle 1. Nicht typisierter Ausdruck Verwendung in Ausdrücken (einschließlich Auswahlliste, CASEund VALUES)
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:
   (? + ?) + 10
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:
   ? + (? * 10)
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 Ergebnisdatentypen auf 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 Ergebnisdatentypen auf 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 Ergebnisdatentypen auf 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 Ergebnisdatentypen auf 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)
Hinweis:
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.

Tabelle 2. Nicht typisierter Ausdruck Verwendung in Vergleichselementen
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 Ergebnisdatentypen auf 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)
Tabelle 3. Nicht typisierter Ausdruck Verwendung in integrierten Funktionen
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 Ergebnisdatentypen auf 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 Ergebnisdatentypen auf 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 Ergebnisdatentypen auf 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.
Tabelle 4. Nicht typisierter Ausdruck Verwendung in benutzerdefinierten Routinen
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