Data Types (SQL)
InterSystems SQL でのデータ型
データ型は、テーブル列で保持できる値の種類を指定します。InterSystems SQL では、CREATE TABLE または ALTER TABLE を使用してフィールドを定義するときにデータ型を指定します。データ定義言語 (DDL) のデータ型または InterSystems IRIS のデータ型クラスを定義できます。以下に例を示します。
CREATE TABLE Employees (
FirstName VARCHAR(30),
LastName VARCHAR(30),
StartDate TIMESTAMP)
CREATE TABLE Employees (
FirstName %String(MAXLEN=30),
LastName %String(MAXLEN=30),
StartDate %TimeStamp)
InterSystems IRIS へのデータ型のマッピングの表示
各 DDL データ型はそれと同等の InterSystems IRIS データ型にマッピングされます。システムで標準のマッピングを表示するには以下の手順に従います。
-
管理ポータルで、[システム管理] を選択します。
-
[構成] > [SQL とオブジェクトの設定] に移動し、[システム DDL マッピング] をクリックします。
[システム定義DDLマッピング] ページに、以下の各列があるテーブルが表示されます。
-
Name — 指定できる DDL データ型の名前です。DDL データ型名では大文字と小文字が区別されません。
-
Datatype — InterSystems IRIS クラスで DDL データ型のマッピング先となっているデータ型の名前です。クラス名では大文字と小文字が区別されます。
[システム定義DDLマッピング] ページで既存のデータ型を変更でき、また削除できます。%1 などのリテラル・データ型パラメータと $$maxval^%apiSQL(%1,%2) などの関数パラメータなどのマッピングを以下の表に示します。これらのパラメータの詳細は、"データ型マッピング・パラメータ" を参照してください。
DDL データ型 | 対応する InterSystems IRIS データ型クラス |
---|---|
BIGINT |
%Library.BigIntOpens in a new tab BIGINT 列に NULL ときわめて小さい負数の両方を記述する可能性がある場合は、標準のインデックス照合をサポートするために、インデックスの NULL 標識の再定義が必要になることがあります。詳細は、"NULL のインデックス付け" を参照してください。 |
BIGINT(%1) |
%Library.BigIntOpens in a new tab %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。このデータ型は BIGINT と同等です。 |
BINARY |
%Library.BinaryOpens in a new tab(MAXLEN=1) |
BINARY VARYING |
%Library.BinaryOpens in a new tab(MAXLEN=1) |
BINARY VARYING(%1) |
%Library.BinaryOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
BINARY(%1) |
%Library.BinaryOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
BIT | %Library.BooleanOpens in a new tab
このデータ型の詳細は、"BIT データ型" を参照してください。 |
BLOB | %Stream.GlobalBinaryOpens in a new tab |
CHAR |
%Library.StringOpens in a new tab(MAXLEN=1) |
CHAR VARYING |
%Library.StringOpens in a new tab(MAXLEN=1) |
CHAR VARYING(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
CHAR(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
CHARACTER |
%Library.BinaryOpens in a new tab(MAXLEN=1) |
CHARACTER VARYING |
%Library.StringOpens in a new tab(MAXLEN=1) |
CHARACTER VARYING(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
CHARACTER(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
CLOB | %Stream.GlobalCharacterOpens in a new tab |
DATE | %Library.DateOpens in a new tab |
DATETIME | %Library.DateTimeOpens in a new tab |
DATETIME2 | %Library.DateTimeOpens in a new tab |
DEC |
%Library.NumericOpens in a new tab (MAXVAL=999999999999999, MINVAL=-999999999999999, SCALE=0) |
DEC(%1) |
%Library.NumericOpens in a new tab(MAXVAL=<|'$$maxval^%apiSQL(%1,0)'|>,MINVAL=<|'$$minval^%apiSQL(%1,0)'|>,SCALE=0) このデータ型は関数パラメータを使用し、位取りを 0 として、入力精度パラメータ (%1) に基づき、MINVAL と MAXVAL を設定します。これらのパラメータの詳細は、"精度と小数桁数" を参照してください。 例 : DEC(4) は %Library.NumericOpens in a new tab(MAXVAL=9999,MINVAL=–9999,SCALE=0) にマッピングされます。 |
DEC(%1,%2) |
%Library.NumericOpens in a new tab (MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>, MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>, SCALE=%2) このデータ型は関数パラメータを使用して、入力精度パラメータ (%1) および位取りパラメータ (%2) に基づき、MINVAL、MAXVAL、SCALE を設定します。これらのパラメータの詳細は、"精度と小数桁数" を参照してください。 例 : DEC(8,4) は %Library.NumericOpens in a new tab(MAXVAL=9999.9999,MINVAL=-9999.9999,SCALE=4) にマッピングされます。 |
DECIMAL |
%Library.NumericOpens in a new tab (MAXVAL=999999999999999, MINVAL=-999999999999999, SCALE=0) |
DECIMAL(%1) |
%Library.NumericOpens in a new tab(MAXVAL=<|'$$maxval^%apiSQL(%1,0)'|>,MINVAL=<|'$$minval^%apiSQL(%1,0)'|>,SCALE=0) このデータ型は関数パラメータを使用し、位取りを 0 として、入力精度パラメータ (%1) に基づき、MINVAL と MAXVAL を設定します。これらのパラメータの詳細は、"精度と小数桁数" を参照してください。このデータ型は 64 ビット符号付き整数です。 例 : DECIMAL(6) は %Library.NumericOpens in a new tab(MAXVAL=999999,MINVAL=-999999,SCALE=0) にマッピングされます。 |
DECIMAL(%1,%2) |
%Library.NumericOpens in a new tab (MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>, MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>, SCALE=%2) このデータ型は関数パラメータを使用して、入力精度パラメータ (%1) および位取りパラメータ (%2) に基づき、MINVAL、MAXVAL、SCALE を設定します。これらのパラメータの詳細は、"精度と小数桁数" を参照してください。 例 : DECIMAL(8,4) は %Library.NumericOpens in a new tab(MAXVAL=9999.9999,MINVAL=-9999.9999,SCALE=4) にマッピングされます。 |
DOUBLE |
%Library.DoubleOpens in a new tab これは IEEE 浮動小数点で標準のデータ型です。このデータ型を持つ SQL 列は、既定では有効桁数が 20 の値を返します。最大値と最小値の制限などの重要な詳細は、$DOUBLE 関数の説明を参照してください。 |
DOUBLE PRECISION |
%Library.DoubleOpens in a new tab これは IEEE 浮動小数点で標準のデータ型です。このデータ型を持つ SQL 列は、既定では有効桁数が 20 の値を返します。最大値と最小値の制限などの重要な詳細は、$DOUBLE 関数の説明を参照してください。 |
FLOAT |
%Library.DoubleOpens in a new tab これは IEEE 浮動小数点で標準のデータ型です。このデータ型を持つ SQL 列は、既定では有効桁数が 20 の値を返します。 |
FLOAT(%1) |
%Library.DoubleOpens in a new tab これは IEEE 浮動小数点で標準のデータ型です。このデータ型を持つ SQL 列は、既定では有効桁数が 20 の値を返します。 |
IMAGE | %Stream.GlobalBinaryOpens in a new tab |
INT |
%Library.IntegerOpens in a new tab (MAXVAL=2147483647, MINVAL=-2147483648) |
INT(%1) |
%Library.IntegerOpens in a new tab (MAXVAL=2147483647, MINVAL=-2147483648) %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。このデータ型は INT と同等です。 |
INTEGER |
%Library.IntegerOpens in a new tab (MAXVAL=2147483647, MINVAL=-2147483648) |
LONG | %Stream.GlobalCharacterOpens in a new tab |
LONG BINARY | %Stream.GlobalBinaryOpens in a new tab |
LONG RAW | %Stream.GlobalBinaryOpens in a new tab |
LONG VARCHAR | %Stream.GlobalCharacterOpens in a new tab |
LONG VARCHAR(%1) |
%Stream.GlobalCharacterOpens in a new tab %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。 |
LONGTEXT |
%Stream.GlobalCharacterOpens in a new tab %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。 |
LONGVARBINARY | %Stream.GlobalBinaryOpens in a new tab |
LONGVARBINARY(%1) |
%Stream.GlobalBinaryOpens in a new tab %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。 |
LONGVARCHAR | %Stream.GlobalCharacterOpens in a new tab |
LONGVARCHAR(%1) | %Stream.GlobalCharacterOpens in a new tab |
MEDIUMINT |
%Library.IntegerOpens in a new tab (MAXVAL=8388607,MINVAL=-8388608) このデータ型は、MySQL との互換性を維持するために用意されています。 |
MEDIUMINT(%1) |
%Library.IntegerOpens in a new tab (MAXVAL=8388607,MINVAL=-8388608) %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。 |
MEDIUMTEXT | %Stream.GlobalCharacterOpens in a new tab |
MONEY | %Library.CurrencyOpens in a new tab |
NATIONAL CHAR | %Library.StringOpens in a new tab(MAXLEN=1) |
NATIONAL CHAR VARYING | %Library.StringOpens in a new tab(MAXLEN=1) |
NATIONAL CHAR VARYING(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
NATIONAL CHAR(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
NATIONAL CHARACTER | %Library.StringOpens in a new tab(MAXLEN=1) |
NATIONAL CHARACTER VARYING | %Library.StringOpens in a new tab(MAXLEN=1) |
NATIONAL CHARACTER VARYING(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
NATIONAL CHARACTER(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
NATIONAL VARCHAR | %Library.StringOpens in a new tab(MAXLEN=1) |
NATIONAL VARCHAR(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
NCHAR |
%Library.StringOpens in a new tab(MAXLEN=1) |
NCHAR(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
NTEXT | %Stream.GlobalCharacterOpens in a new tab |
NUMBER |
%Library.NumericOpens in a new tab(SCALE=0) このデータ型は 64 ビット符号付き整数です。 |
NUMBER(%1) |
%Library.NumericOpens in a new tab(MAXVAL=<|'$$maxval^%apiSQL(%1)'|>,MINVAL=<|'$$minval^%apiSQL(%1)'|>,SCALE=0) このデータ型は関数パラメータを使用し、位取りを 0 として、入力精度パラメータ (%1) に基づき、MINVAL と MAXVAL を設定します。このデータ型は 64 ビット符号付き整数です。 例 : NUMBER(6) は %Library.NumericOpens in a new tab(MAXVAL=999999,MINVAL=-999999,SCALE=0) にマッピングされます。 |
NUMBER(%1,%2) |
%Library.NumericOpens in a new tab (MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>, MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>, SCALE=%2) このデータ型は関数パラメータを使用して、入力精度パラメータ (%1) および位取りパラメータ (%2) に基づき、MINVAL、MAXVAL、SCALE を設定します。 例 : NUMBER(8,4) は %Library.NumericOpens in a new tab(MAXVAL=9999.9999,MINVAL=-9999.9999,SCALE=4) にマッピングされます。 |
NUMERIC |
%Library.NumericOpens in a new tab (MAXVAL=999999999999999, MINVAL=-999999999999999, SCALE=0) |
NUMERIC(%1) |
%Library.NumericOpens in a new tab(MAXVAL=<|'$$maxval^%apiSQL(%1,0)'|>,MINVAL=<|'$$minval^%apiSQL(%1,0)'|>,SCALE=0) このデータ型は関数パラメータを使用し、位取りを 0 として、入力精度パラメータ (%1) に基づき、MINVAL と MAXVAL を設定します。このデータ型は 64 ビット符号付き整数です。 例 : NUMERIC(6) は %Library.NumericOpens in a new tab(MAXVAL=999999,MINVAL=-999999,SCALE=0) にマッピングされます。 |
NUMERIC(%1,%2) |
%Library.NumericOpens in a new tab (MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>, MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>, SCALE=%2) このデータ型は関数パラメータを使用して、入力精度パラメータ (%1) および位取りパラメータ (%2) に基づき、MINVAL、MAXVAL、SCALE を設定します。 例 : NUMERIC(8,4) は %Library.NumericOpens in a new tab(MAXVAL=9999.9999,MINVAL=-9999.9999,SCALE=4) にマッピングされます。 |
NVARCHAR | %Library.StringOpens in a new tab(MAXLEN=1) |
NVARCHAR(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
NVARCHAR(%1,%2) | %Library.StringOpens in a new tab(MAXLEN=%1) |
NVARCHAR(MAX) |
%Stream.GlobalCharacterOpens in a new tab このデータ型は LONGVARCHAR と同等であり、TSQL との互換性を維持するために用意されています。 |
POSIXTIME | %Library.PosixTimeOpens in a new tab |
RAW(%1) |
%Library.BinaryOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
REAL |
%Library.DoubleOpens in a new tab これは IEEE 浮動小数点で標準のデータ型です。このデータ型を持つ SQL 列は、既定では有効桁数が 20 の値を返します。 |
ROWVERSION |
%Library.RowVersionOpens in a new tab このデータ型は、システムによって割り当てられる連番の整数です。詳細は、"ROWVERSION データ型" を参照してください。 |
SERIAL |
%Library.CounterOpens in a new tab このデータ型はシステムによって生成されます。 |
SMALLDATETIME | %Library.DateTimeOpens in a new tab(MINVAL="1900-01-01 00:00:00",MAXVAL="2079-06-06 23:59:59") |
SMALLINT | %Library.SmallIntOpens in a new tab |
SMALLINT(%1) |
%Library.SmallIntOpens in a new tab %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。このデータ型は SMALLINT と同等です。 |
SMALLMONEY | %Library.CurrencyOpens in a new tab |
SYSNAME | %Library.StringOpens in a new tab(MAXLEN=128) |
TEXT | %Stream.GlobalCharacterOpens in a new tab |
TIME | %Library.TimeOpens in a new tab |
TIME(%1) |
%Library.TimeOpens in a new tab(PRECISION=%1) PRECISION は秒の小数部の桁数で、0 ~ 9 の範囲の整数値です。 |
TIMESTAMP | %Library.PosixTimeOpens in a new tab |
TIMESTAMP2 | %Library.TimeStampOpens in a new tab |
TINYINT | %Library.TinyIntOpens in a new tab |
TINYINT(%1) |
%Library.TinyIntOpens in a new tab %1 パラメータは無視されます。これは、MySQL との互換性を維持するために用意されています。このデータ型は TINYINT と同等です。 |
UNIQUEIDENTIFIER | %Library.UniqueIdentifierOpens in a new tab |
VARBINARY | %Library.BinaryOpens in a new tab(MAXLEN=1) |
VARBINARY(%1) |
%Library.BinaryOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
VARCHAR | %Library.StringOpens in a new tab(MAXLEN=1) |
VARCHAR(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
VARCHAR(%1,%2) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
VARCHAR(MAX) |
%Stream.GlobalCharacterOpens in a new tab このデータ型は LONGVARCHAR と同等であり、TSQL との互換性を維持するために用意されています。 |
VARCHAR2(%1) |
%Library.StringOpens in a new tab(MAXLEN=%1) %1 はデータ型の最大長を設定します。 |
VECTOR |
データ型マッピング・パラメータ
多くの場合、[システム定義DDLマッピング] テーブルには、各データ型に指定できるパラメータがわかるように、データ型ごとに複数のエントリが表示されます。このマッピング・テーブルには、パラメータの既定値も表示されます。一般的には、DDL データ型よりもデータ型クラスの方に、使用できるデータ値を定義するためのパラメータがより多く用意されています。リテラル・パラメータまたは関数パラメータを指定できます。また、追加のデータ型クラス・パラメータも定義できます。
リテラル・パラメータ
リテラル・パラメータは、DDL データ型と、%n 形式の InterSystems IRIS データ型で識別します。n はデータ型引数の番号です。例えば、VARCHAR(%1) は %String(MAXLEN=%1) にマッピングされます。
一般的なリテラル・パラメータとして、最大文字列長、最小値と最大値、精度と位取りの値などがあります。
最大長
データ型クラスでは、MAXLEN パラメータで文字列データ型の最大長を指定します。多くの場合、DDL 型では、それに対応する名前なしパラメータでこれらの値を定義します。
このフィールドの定義では、データ型は最大 64 文字の文字列です。
ProductName VARCHAR(64)
ProductName %String(MAXLEN=64)
このパラメータを指定するときは以下の点に注意します。
-
MAXLEN 値が指定されていないフィールドには、最大文字列長までの任意の長さの値を設定できます。最大長の文字列フィールドを定義するには、VARCHAR("") を指定します。これにより、データ型 %Library.String(MAXLEN="") のプロパティが作成されます。VARCHAR() では、データ型 %Library.String(MAXLEN=1) のプロパティが作成されます。MAXLEN 値が指定されていないバイナリ・フィールドを定義するには、VARBINARY("") を指定します。これにより、データ型 %Library.Binary(MAXLEN="") のプロパティが作成されます。VARBINARY() では、データ型 %Library.Binary(MAXLEN=1) のプロパティが作成されます。
-
大きい MAXLEN 値の指定 : MAXLEN 値が大きすぎると、ODBC アプリケーションに影響することがあります。ODBC アプリケーションは、サーバからメタデータに基づいて、必要なフィールド・サイズを決定しようとします。そのため、このアプリケーションは、実際に必要な量よりも多くのバッファ・スペースを割り当てる可能性があります。このため、InterSystems IRIS では、システム全体の既定の ODBC VARCHAR の最大長を 4096 に設定します。このシステム全体の既定値は、管理ポータルを使用して構成可能です。[システム管理] から、[構成]、[SQL およびオブジェクトの設定]、[SQL] の順に選択します。[VARCHAR の既定の長さ] オプションを表示または設定します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。InterSystems ODBC ドライバは、TCP バッファからデータを取得し、それをアプリケーションのバッファに変換します。そのため、MAXLEN のサイズが ODBC クライアントに影響することはありません。
最大値と最小値
データ型クラスでは、MINVAL パラメータと MAXVAL パラメータで数値データ型の最小値と最大値を指定します。多くの場合、データ型クラスにはリテラル・パラメータではなく関数パラメータを使用して、これらの値を定義します。DDL 型には、これに相当するパラメータがありません。
このフィールド定義では、データ型は 0 から 100 までの整数です。
Capacity %Integer(MINVAL=0,MAXVAL=100)
精度と小数桁数
データ型クラスの PRECISION パラメータと SCALE パラメータは、それぞれ精度 (最大桁数) と位取り (最大小数点以下桁数) を指定する整数値です。多くの場合、データ型クラスでは、これらの値をリテラル・パラメータではなく関数パラメータで定義します。NUMERIC などの DDL データ型では、精度と位取りを名前なしパラメータとしてまとめて指定することが普通です。
以下のフィールド定義では、精度が 6 で位取りが 2 の数を定義します。
UnitPrice NUMERIC(6,2) // Range: -9999.99 to 9999.99
精度と位取りのパラメータでは、数値データ型を以下のように定義します。
-
精度 — 最大許容値と最小許容値です。0 から 19 までの整数に s を加算した値を指定します。s は小数点以下桁数です。一般的に精度は数値の合計桁数ですが、その正確な値は、%Library クラス・データ型のマッピングによって決まります。この最大整数値は 9223372036854775807 です。19 + s より大きな精度は既定で 19 + s になります。
-
位取り — 最大許容小数点以下桁数です。整数で指定します。s が精度 p 以上の場合は小数以下の数値のみを使用でき、実際の p 値は無視されます。許容される最大のスケールは 18 です。これは .999999999999999999 に相当します。18 より大きなスケールは既定で 18 になります。
数値のフォーマットの詳細は、$FNUMBER 関数の説明を参照してください。
関数パラメータ
DDL データ型のパラメータを InterSystems IRIS データ型に入力できるように、事前に変換する必要がある場合に関数パラメータを使用します。以下の例では、DDL データ型数値の精度と位取りの各パラメータを InterSystems IRIS データ型の MAXVAL パラメータと MINVAL パラメータに変換しています。
例えば、管理ポータルの [システム定義DDLマッピング] テーブルに表示するために、DECIMAL DDL データ型と %NumericOpens in a new tab クラスとのマッピングを考えます。
DECIMAL(%1,%2)
%Numeric(MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>,MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>,SCALE=%2)
パラメータ %1 と %2 で、目的とするデータ型数値の精度と位取りをそれぞれ指定します。例えば、データ型が DECIMAL(4,2) のフィールドには、精度が 4 桁で小数点以下が 2 桁の数値を格納します。InterSystems SQL では、これらのパラメータを使用して、フィールドの最小許容値 (–99.99) と最大許容値 (99.99) が導き出されます。
%NumericOpens in a new tab クラスの場合、InterSystems IRIS で SCALE パラメータ (SCALE=%2) は設定されますが、設定すべき PRECISION パラメータがありません。代わりに、以下の各変換関数を使用して MAXVAL パラメータと MINVAL パラメータが設定されます。
-
maxval^%apiSQL(precision,scale) は、精度と位取りを設定した、有効な数値の最大値 MAXVAL を返します。
-
minval^%apiSQL(precision,scale) は、精度と位取りを設定した、有効な数値の最小値 MINVAL を返します。
これらの変換関数の構文は以下のとおりです。
dataTypeClass(param=<|'func'|>, param2=<|func2|>, ...)
-
dataTypeClass — マッピング先となるデータ型クラスの名前です。例 : %Numeric
-
param — 設定するデータ型クラス・パラメータの名前です。例 : MAXVAL
-
func — パラメータの設定に使用する関数呼び出しです。例 : maxval^%apiSQL(%1,%2)
<|'func'|> 式は、指定された値を使用して func のパラメータを置き換えること、続いて指定の値でこの関数を呼び出すことを DDL プロセッサに指示します。続いて、この関数の呼び出しから返された値で <|'func'|> 式が置き換えられます。
その他のパラメータ
DDL データ型では定義できないものの、データ型クラスでは定義できるデータ定義パラメータがあります。これには、許可されるデータ値の列挙リスト、許可されるデータ値のパターン・マッチング、MAXLEN の最大長を超えるデータ値の自動切り捨てなどのデータ検証操作が含まれます。
新しい DDL データ型の作成
データ型の設定は、システム・データ型のパラメータ値のデータ型マッピングをオーバーライドするか、新しいユーザ・データ型を定義することによって変更できます。システム・データ型を変更して、インターシステムズ既定のマッピングをオーバーライドできます。ユーザ定義のデータ型を作成して、インターシステムズが提供していないデータ型マッピングを追加することができます。
新しい DDL データ型とそのマッピングを作成するには以下の手順に従います。
-
管理ポータルで、[システム管理]を選択します。
-
[構成] > [SQL とオブジェクトの設定] に移動し、[ユーザ定義DDLマッピング] をクリックします。
-
[新規ユーザ定義DDLマッピング作成] をクリックして、データ型を入力するフォームを開きます。
-
フォームの [名前] フィールドに、DDL データ型の仕様を入力します。例えば、「VARCHAR(100)」と入力します。
-
[データタイプ] フィールドに、InterSystems IRIS の既存データ型クラスの名前または作成したデータ型の名前を入力します。例えば、「MyString100(MAXLEN=100)」と入力します。
-
[保存] をクリックします。
[ユーザ定義DDLマッピング] テーブルに新しいエントリが表示されます。このテーブルでエントリを変更または削除できます。
ユーザ定義データ型をデータ型クラスとして作成できます。例えば、最大で 10 文字を取得して残りの入力データを切り捨てる文字列データ型を作成できます。このデータ型 Sample.TruncStr は以下のように作成します。
Class Sample.TruncStr Extends %Library.String
{
Parameter MAXLEN=10;
Parameter TRUNCATE=1;
}
このデータ型をテーブル定義で使用するには、以下のようにデータ型クラス名を指定します。
CREATE TABLE Sample.ShortNames (Name Sample.TruncStr)
データ型クラスを作成するときは以下の点に注意します。
-
MINVAL や MAXVAL などのパラメータを関数に設定するには関数パラメータを使用します。
-
Stream のコレクション型を持つ InterSystems IRIS プロパティに DDL データ型をマップする必要がある場合は、文字ストリーム・データには %Stream.GlobalCharacter を、バイナリ・ストリーム・データには %Stream.GlobalBinary をそれぞれ指定します
-
[SystemDataTypes] テーブルの DDL データ型列にないデータ型が DDL で検出されると、次に [UserDataTypes] テーブルが調べられます。どちらのテーブルにもデータ型マッピングがない場合は、そのデータ型は変換されず、DDL で指定されているクラス定義に直接渡されます。
例えば、以下のフィールド定義が DDL 文にあるとします。
CREATE TABLE TestTable ( Field1 %String, Field2 %String(MAXLEN=45) )
上記の定義では、%String、%String(MAXLEN=%1)、または %String(MAXLEN=45) のマッピングが、[SystemDataTypes] と [UserDataTypes] に見つからない場合、%String と %String(MAXLEN=45) 型が適切なクラス定義に直接渡されます。
特定のデータ型の処理
日付、時刻、およびタイムスタンプのデータ型
InterSystems SQL 標準の日付、時刻の関数を使用して、日付、時刻、タイムスタンプのデータ型を定義できます。また、日付とタイムスタンプを相互に変換することもできます。例えば、CURRENT_DATE や CURRENT_TIMESTAMP をデータ型で定義されたフィールドへの入力として使用したり、DATEADD、DATEDIFF、ATENAME、または DATEPART を使用して、このデータ型で保存された日付値を操作したりできます。
日付、時刻、タイムスタンプのデータ型クラスと SQL のタイプとの対応を以下の表に示します。データ型クラスでは、SQL で計算するときにこのタイプを使用します。カスタムのデータ型クラスを作成すると、これらのマッピングを使用して、どの SQL タイプを指定するべきかをクラス定義の SqlCategory キーワードで指定できます。以下に例を示します。
Class MyApp.MyDateDT [ ClassType = DataType, SQLCategory = DATE ]
{
// class members
}
データ型クラス | 対応する SQL タイプ | 留意事項 |
---|---|---|
|
DATE |
既定では、DATE および対応する %Library.DateOpens in a new tab データ型には正の整数のみを指定できます。0 を指定すると 1840-12-31 になります。1840-12-31 より前の日付をサポートするには、テーブル内にデータ型 %Library.Date(MINVAL=-nnn) の日付フィールドを定義する必要があります。MINVAL は、1840-12-31 から最大値 -672045 (0001-01-01) まで遡ってカウントする負の日数です。%Library.DateOpens in a new tab には、日付値を -672045 から 2980013 の範囲の符号なし整数または負の整数として格納できます。日付値は以下のように入力できます。
|
|
TIME |
%Library.TimeOpens in a new tab は、日付値を 0 から 86399 までの符号なし整数 (午前 0 時 00 分からの秒数) として格納します。時刻値は以下のように入力できます。
TIME は秒の小数部をサポートするので、このデータ型はユーザが指定した最大 9 までの精度の桁数 (F) に合わせて HH:MI:SS.FF にも使用できます。秒の小数部をサポートするには、PRECISION パラメータを設定します。例えば、TIME(0) (%Time(PRECISION=0)) は、最も近い秒に丸めます。TIME(2) (%Time(PRECISION=2)) は、小数点以下 2 桁の精度に丸めます (または 0 で埋めます)。 指定されたデータで精度も指定している場合 (CURRENT_TIME(3) など)、保存される小数点以下の桁は以下のようになります。
SQL メタデータは時刻精度の小数点以下桁数を “スケール” としてレポートします。ここでは、データ全体の長さに対し、ワードの “精度” を使用します。TIME データ型を使用するフィールドは、精度とスケールのメタデータについて次のようにレポートします。TIME(0) (%Time(PRECISION=0)) のメタデータ精度は 8 (nn:nn:nn)、スケールは 0 です。TIME(2) (%Time(PRECISION=2)) のメタデータ精度は11 (nn:nn:nn.ff)、スケールは 2 です。TIME (%Time または %Time(PRECISION="")) は、指定されたデータから秒の小数部の精度を取得するため、メタデータの精度 18 を持ち、スケールは定義されていません。データ型、精度、およびスケールのメタデータを返す方法の詳細は、"select-item のメタデータ" を参照してください。 |
|
TIMESTAMP |
%Library.PosixTimeOpens in a new tab の最大精度は 6 桁ですが、%Library.TimeStampOpens in a new tab の最大精度は、秒の小数点以下桁数を最大 9 桁として、システム・プラットフォームの精度から導き出されます。したがって、同じプラットフォームにおいて、%Library.TimeStampOpens in a new tab の方が %Library.PosixTimeOpens in a new tab よりも精度が高くなる場合があります。%Library.TimeStampOpens in a new tab の正規化により、9 桁の精度を超える入力値は自動的に 9 桁の小数秒に切り捨てられます。
Note:
%Library.DateTimeOpens in a new tab は %Library.TimeStampOpens in a new tab のサブクラスです。これは、DATEFORMAT という名前の型パラメータを定義します。また、TSQL アプリケーションで習慣的に使用されている不正確な日時入力に対処するよう、DisplayToLogical() および OdbcToLogical() メソッドをオーバーライドします。 |
|
MVDATE |
このデータ型は、MultiValue との互換性を維持する目的でのみサポートされています。 |
|
DATE |
このクラスを定義するときは、論理日付値を %Library.DateOpens in a new tab 論理値に変換する LogicalToDate() メソッドと、それとは逆方向に変換する DateToLogical() メソッドを定義します。 |
|
POSIXTIME |
%PosixTime は、1970–01–01 00:00:00 以降の秒数 (および秒の小数部) から計算されるエンコードされたタイムスタンプです。その日付以降のタイムスタンプは正の %PosixTime 値で表され、その日付以前のタイムスタンプは負の %PosixTime 値で表されます。%PosixTime は、最大 6 桁の秒の小数部の精度をサポートします。%PosixTime でサポートされる最初の日付は 0001-01-01 00:00:00 で、論理値 -6979664624441081856 を持ちます。サポートされる最後の日付は 9999-12-31 23:59:59.999999 で、論理値 1406323805406846975 を持ちます。 エンコードされた 64 ビットの整数で %PosixTime 値は常に表されるため、%Date 値や %TimeStamp 値と常に明確に区別できます。例えば、1970–01–01 00:00:00 の %PosixTime 値は 1152921504606846976、2017–01–01 00:00:00 の %PosixTime 値は 1154404733406846976、1969–12–01 00:00:00 の %PosixTime 値は -6917531706041081856 になります。 %PosixTime は %TimeStamp データ型よりもディスク領域やメモリの使用量が少なく、%TimeStamp よりもパフォーマンスが高いため、%TimeStamp よりも優れています。 ODBC 表示モードを使用することで、%PosixTime 値と %TimeStamp 値を統合できます。
TO_POSIXTIME 関数または TOPOSIXTIME()Opens in a new tab メソッドを使用して、%TimeStamp 値を %PosixTime に変換できます。IsValid()Opens in a new tab メソッドを使用することで、数値が有効な %PosixTime 値であるかどうかを判定できます。 |
上記の論理値のいずれにも該当しない時刻データ型 |
TIME |
このクラスを作成するときは、論理時間値を %Library.TimeOpens in a new tab 論理値に変換する LogicalToTime() メソッドと、それとは逆方向に変換する TimeToLogical() メソッドを定義します。 |
上記の論理値のいずれにも該当しないタイムスタンプ・データ型 |
TIMESTAMP |
このクラスを定義するときは、論理タイムスタンプ値を %Library.TimeStampOpens in a new tab 論理値に変換する LogicalToTimeStamp() メソッドと、それとは逆方向に変換する TimeStampToLogical() メソッドを定義します。 |
演算子 =、<>、>、または < を使用して、POSIXTIME を DATE 値または TIMESTAMP 値と比較できます。詳細は "述語の概要" を参照してください。
InterSystems IRIS では、FMTIMESTAMP カテゴリ値と DATE カテゴリ値を比較する場合に、DATE と比較する前に FMTIMESTAMP 値から時間を削除することはありません。この動作は、TIMESTAMP と DATE の値の比較、および TIMESTAMP と MVDATE の値の比較に対する動作と同じになりました。これは、他の SQL ベンダによるタイムスタンプと日付の比較方法とも互換性があります。つまり、FMTIMESTAMP 320110202.12 と DATE 62124 の比較は、SQL等値 (=) 演算子を使用した比較では等しくなります。アプリケーションでは、FMTIMESTAMP 値を DATE または FMDATE 値に変換して値の日付部分のみを比較する必要があります。
1840 年 12 月 31 日より前の日付
日付は一般的に、DATE データ型、または TIMESTAMP データ型で表されます。
DATE データ型は、$HOROLOG 形式で日付を格納し、任意の開始日 1840 年 12 月 31 日以降の日数を正の整数値としてカウントします。既定では、日付は正の整数値でのみ表すことができます (MINVAL=0。これは 1840 年 12 月 31 日に相当します)。ただし、%Library.DateOpens in a new tab MINVAL 型パラメータを変更することで、1840 年 12 月 31 日より前の日付の格納を可能にできます。MINIVAL を負の数値に設定すると、1840 年 12 月 31 日より前の日付を負の整数値として格納できます。使用可能な最も前の MINIVAL 値は -672045 です。これは西暦 1 年 (CE) 1 月 1 日に対応します。DATE データ型で BCE (紀元前) の日付を表すことはできません。
TIMESTAMP データ型は、既定で、許容される最も早いタイムスタンプである 1840–12–31 00:00:00 となります。ただし、MINVAL パラメータを変更すれば、1840 年 12 月 31 日より前の日付を保存できるフィールドまたはプロパティを定義できます (例 : MyTS %Library.TimeStamp(MINVAL='1492-01-01 00:00:00'))。許容される最も早い MINVAL 値は 0001–01–01 00:00:00 です。これは西暦 1 年 1 月 1 日に相当します。%TimeStamp データ型で BCE (紀元前) の日付を表すことはできません。
これらの日付のカウントでは、グレゴリオ暦の導入 (1582 年 10 月に制定、ただし英国およびその植民地で採用されたのは 1752 年) による日付の変更が考慮されないことに注意してください。
ロケールの最小の日付は、以下のように再定義できます。
SET oldMinDate = ##class(%SYS.NLS.Format).GetFormatItem("DATEMINIMUM")
IF oldMinDate=0 {
DO ##class(%SYS.NLS.Format).SetFormatItem("DATEMINIMUM",-672045)
SET newMinDate = ##class(%SYS.NLS.Format).GetFormatItem("DATEMINIMUM")
WRITE "Changed earliest date to ",newMinDate
}
ELSE { WRITE "Earliest date was already reset to ",oldMinDate}
上記の例では、ロケールの MINIVAL を、使用可能な最も早い日付 (1/1/01) に設定します。ロケールに基づく日付構成の詳細は、"各国言語サポート (NLS) の構成" を参照してください。
文字列
InterSystems IRIS では、文字列を扱うのに固定量のメモリを許可しているため、文字列長の制限があります。一般に、極端に長い文字列には %Stream.GlobalCharacterOpens in a new tab データ型のいずれかを割り当てる必要があります。
データベース・ドライバの接続には、文字列長の制限が適用されません。InterSystems IRIS インスタンスと ODBC ドライバ機能でサポートされているプロトコルが異なる場合は、2 つのプロトコルの中で下位のものが使用されます。実際に使用されたプロトコルは、InterSystems ODBC ログに記録されます。
既定では、InterSystems IRIS はシステム全体の ODBC VARCHAR の最大長を 4096 に設定します。この ODBC の最大長は構成可能です。
リスト構造
InterSystems IRIS は、リスト構造のデータ型 %List (データ型クラス %Library.List) をサポートしています。これは圧縮バイナリ形式であり、InterSystems SQL で対応するネイティブなデータ型にマップしません。その内部表現では、データ型 VARBINARY に対応しており、その MAXLEN の既定値は 32749 です。InterSystems IRIS は、リスト構造データ型 %ListOfBinary (データ型クラス %Library.ListOfBinary) をサポートしています。これはデータ型 VARBINARY に対応しており、その MAXLEN の既定値は 4096 です。
このため、ダイナミック SQL では、WHERE 節での比較に %List データを使用できません。また、型 %List のプロパティ値を設定するときに、INSERT も UPDATE も使用できません。
ダイナミック SQL では、リスト構造化されたデータのデータ型が VARCHAR として返されます。クエリ内のフィールドのデータ型が %List または %ListOfBinary かどうかを確認するには、select-item 列メタデータのブーリアン・フラグ isList を使用できます。これらのデータ型の CType (クライアント・データ型) 整数コードは 6 です。
ODBC クライアントまたは JDBC クライアントを使用する場合には、LogicalToOdbc 変換を使用して、%List データが VARCHAR 文字列データに投影されます。リストは、各要素がコンマで区切られた文字列として投影されます。この型のデータは、WHERE 節、INSERT 文および UPDATE 文で使用できます。既定では、InterSystems IRIS はシステム全体の ODBC VARCHAR の最大長を 4096 に設定します。この ODBC の最大長は構成可能です。
"%Library.ListOpens in a new tab" でこのクラスの詳細も参照してください。WHERE 節でのリストの使用に関する詳細は、"%INLIST" 述語および "FOR SOME %ELEMENT" 述語の説明を参照してください。リスト・データを文字列として処理する方法の詳細は、"%EXTERNAL" 関数を参照してください。
InterSystems SQL は、$LIST、$LISTBUILD、$LISTDATA、$LISTFIND、$LISTFROMSTRING、$LISTGET、$LISTLENGTH、$LISTTOSTRING の 8 つのリスト関数をサポートしています。ObjectScript は、この他に 3 つのリスト関数をサポートしています。$LISTVALID は式がリストであるかどうかを判断するときに、$LISTSAME は 2 つのリストを比較するときに、$LISTNEXT はリストから要素を順番に取得するときに使用します。
BIT データ型
BIT (%Library.BooleanOpens in a new tab) データ型では、0、1、および NULL を有効な値として使用できます。
-
論理モードおよび ODBC モードでは、使用できる値は 0、1、および NULL だけです。
-
表示モードでは、DisplayToLogical メソッドによって、最初に非 NULL の入力値を以下のように 0 または 1 に変換します。
-
ゼロ以外の数値または数値文字列 = 1。3、'0.1'、'-1'、'7dwarves' など。
-
非数値文字列 = 0。'true'、'false' など。
-
空の文字列 = 0。'' など。
-
ストリーム・データ型
ストリーム・データ型は、InterSystems IRIS クラス・プロパティのデータ型 %Stream.GlobalCharacterOpens in a new tab (CLOB の場合) および %Stream.GlobalBinaryOpens in a new tab (BLOB の場合) に対応します。これらのデータ型クラスは、指定された LOCATION パラメータでストリーム・フィールドを定義するか、このパラメータを省略して既定のシステム定義のストレージ位置にすることができます。
ストリーム・データ型のフィールドは、ほとんどの SQL スカラ関数、集約関数、または単項関数で引数として使用できません。削除しようとすると、SQLCODE -37 エラー・コードが発行されます。例外であるいくつかの機能は、"ストリーム・データ (BLOB と CLOB) の格納と使用" にリストされています。
ストリーム・データ型のフィールドは、ほとんどの SQL 述語条件で引数として使用できません。削除しようとすると、SQLCODE -313 エラー・コードが発行されます。ストリーム・フィールドを受け取る述語は、"ストリーム・データ (BLOB と CLOB) の格納と使用" にリストされています。
シャード・テーブルにストリーム・データ型のフィールドを含めることはできません。
インデックス内、および挿入/更新の実行時におけるストリーム・データ型の使用も制限されています。ストリームの制限の詳細は、"ストリーム・データ (BLOB と CLOB) の格納と使用" を参照してください。
SERIAL データ型
SERIAL (%Library.CounterOpens in a new tab) データ型のフィールドでは、ユーザ指定の正の整数値を使用できます。または、InterSystems IRIS では、連続する正の整数値をそのフィールドに割り当てることができます。%Library.CounterOpens in a new tab は %Library.BigIntOpens in a new tab を拡張します。
INSERT 操作では、SERIAL フィールドに以下のいずれかの値が指定されます。
-
値なし、0 (ゼロ)、または非数値: InterSystems IRIS では、指定された値が無視され、その代わり、このフィールドの現在のシリアル・カウンタ値が 1 ずつインクリメントされ、インクリメント後の整数がフィールドに挿入されます。
-
正の整数値: InterSystems IRIS では、フィールドにユーザ指定の値が挿入され、このフィールドのシリアル・カウンタ値がこの整数値に変更されます。
したがって、SERIAL フィールドには、一連のインクリメンタル整数値が含まれます。これらの値は、連続または一意とは限りません。例えば、SERIAL フィールドでは、1、2、3、17、18、25、25、26、27 といった一連の値が有効です。連続する整数は、InterSystems IRIS で生成されるか、またはユーザが指定します。連続しない整数はユーザが指定します。SERIAL フィールドの値を一意にする場合には、そのフィールドに UNIQUE 制約を適用する必要があります。
UPDATE 操作は、自動的に割り当てられた SERIAL カウンタ・フィールドの値に影響しません。ただし、INSERT OR UPDATE を使用して実行される更新では、SERIAL フィールドに対する後続の挿入操作で整数シーケンスのスキップが発生します。
UPDATE 操作では、SERIAL フィールドに現在、値がない (NULL) 場合、またはその値が 0 の場合にのみ、そのフィールドを変更できます。それ以外の場合には、SQLCODE -105 エラーが生成されます。
InterSystems IRIS では、テーブル内の SERIAL フィールドの数には制約がありません。
ROWVERSION データ型
ROWVERSION データ型は、システムによって割り当てられる、1 で始まる一意の正の整数を含む読み取り専用フィールドを定義します。InterSystems IRIS は、挿入、更新、または %Save の各処理の一部として連続した整数を割り当てます。これらの値をユーザが変更することはできません。
InterSystems IRIS は、ネームスペース全体で 1 つの行バージョン・カウンタを維持します。ROWVERSION フィールドを含むネームスペース内のすべてのテーブルが、同じ行バージョン・カウンタを共有します。このように、ROWVERSION フィールドでは行レベルのバージョン・コントロールが可能なため、ユーザはネームスペース内の 1 つ以上のテーブルの行に対して行った変更の順序を決定できます。
テーブルごとに指定できる ROWVERSION データ型のフィールドは 1 つのみです。
一意キーや主キーに ROWVERSION フィールドを含めることはできません。ROWVERSION フィールドを IDKey インデックスの一部にすることはできません。
ROWVERSION の使用の詳細は、"RowVersion フィールド" を参照してください。
ROWVERSION カウンタと SERIAL カウンタ
ROWVERSION と SERIAL (%Library.CounterOpens in a new tab) データ型フィールドは両方とも、INSERT 操作の一部として内部カウンタから連続した整数を受け取ります。ただし、これらの 2 つのカウンタは大きく異なるうえ、使用目的も異なります。
-
ROWVERSION カウンタはネームスペース・レベルにあります。SERIAL カウンタはテーブル・レベルにあります。これらの 2 つのカウンタは相互から完全に独立しており、RowID カウンタからも独立しています。
-
ROWVERSION カウンタは挿入、更新、または %Save 操作によってインクリメントされます。SERIAL カウンタは挿入操作によってのみインクリメントされます。INSERT OR UPDATE を使用して実行される更新によって、SERIAL カウンタ・シーケンスにギャップが生じる可能性があります。
-
ROWVERSION フィールドの値をユーザ指定にすることはできません。この値には常に ROWVERSION カウンタから指定されます。ユーザが SERIAL フィールドの値を指定していない場合、このフィールドの値には、挿入操作中のテーブルの内部カウンタの値が指定されます。挿入によって SERIAL の整数値が指定される場合、現在のカウンタ値ではなくその値が挿入されます。
-
挿入によって現在の内部カウンタ値よりも大きい SERIAL フィールドの値が指定される場合、InterSystems IRIS はその値をフィールドに挿入し、内部カウンタをその値にリセットします。
-
挿入によって現在のカウンタ値よりも小さい SERIAL フィールドの値が指定されると、InterSystems IRIS は内部カウンタをリセットしません。
-
挿入によって SERIAL フィールドの値を負の整数または小数に指定できます。InterSystems IRIS は、小数を切り捨てて、その整数部分のみにします。指定された SERIAL フィールドの値が 0 または NULL の場合、InterSystems IRIS はユーザ指定の値を無視し、現在の内部カウンタ値を挿入します。
既存の SERIAL フィールドの値を更新することはできません。
-
-
ROWVERSION フィールドの値は常に一意です。ユーザ指定の SERIAL フィールドの値の挿入が可能なため、一意のSERIALフィールドの値を保証するには、UNIQUE フィールド制約を指定する必要があります。
-
ROWVERSION カウンタはリセットできません。TRUNCATE TABLE は SERIAL カウンタをリセットします。すべての行に対して DELETE を実行しても SERIAL カウンタはリセットされません。
-
ROWVERSION フィールドは、テーブルごとに 1 つのみ許可されます。SERIAL フィールドは、1 つのテーブルに複数指定できます。
InterSystems ODBC / JDBC で使用される DDL データ型
InterSystems ODBC は、DDL データ型のサブセットを使用して、このデータ型のサブセットに、その他のデータ型をマップします。これらのマッピングを元に戻すことはできません。例えば、CREATE TABLE mytable (f1 BINARY) 文は、mytable (f1 VARBINARY) として ODBC に投影される InterSystems IRIS クラスを作成します。InterSystems IRIS のリスト・データ型は、VARCHAR 文字列として ODBC に投影されます。
ODBC は、BIGINT、BIT、DATE、DOUBLE、GUID、INTEGER、LONGVARBINARY、LONGVARCHAR、NUMERIC、OREF、POSIXTIME、SMALLINT、TIME、TIMESTAMP、TINYINT、VARBINARY、VARCHAR のデータ型を公開します。既定では、InterSystems IRIS はシステム全体の ODBC VARCHAR の最大長を 4096 に設定します。この ODBC の最大長は構成可能です。
これらの ODBC/JDBC データ型の値の 1 つが InterSystems SQL にマップされると、以下の演算が実行されます。DOUBLE データが $DOUBLE を使用してキャストされます。NUMERIC データが $DECIMAL を使用してキャストされます。
GUID データ型は、InterSystems SQL の UNIQUEIDENTIFIER データ型に相当します。GUID / UNIQUEIDENTIFIER フィールドに有効な値を指定できないと、#7212 一般エラーが生成されます。GUID 値を生成するには、%SYSTEM.Util.CreateGUID()Opens in a new tab メソッドを使用します。
VECTOR
InterSystems SQL では、特定の最適化に非常に適した、圧縮形式でデータを格納する VECTOR 型をサポートしています。ベクトルは型が指定され、ベクトル内のすべてのデータはそのベクトルの型で格納および書式設定されます。ベクトルの型は、integer、decimal、double にすることができます。
VECTOR 型には、以下の 3 つのコンストラクタがあります。
VECTOR(type,length)
VECTOR(type)
VECTOR
CREATE TABLE 文で VECTOR 型の列を定義する場合、その型のコンストラクタでベクトルの長さを指定することをお勧めします。長さが指定されている場合、その列に別の長さのベクトルが追加されると、システムはエラーをスローし、列内のすべてのベクトルが同じ長さになるようにします。この均一性により、VECTOR_DOT_PRODUCT や VECTOR_COSINE などのベクトル関数は、その列のすべてのベクトルで正常に実行されるか、その列のすべてのベクトルで失敗することが保証されます。
データ型間の変換
特定の型から別の型にデータ型を変換するには、CAST または CONVERT 関数を使用します。
CAST は、一部の文字列データ型と数値データ型に加えて、DATE、TIME、および TIMESTAMP と POSIXTIME のタイムスタンプ・データ型への変換をサポートします。
CONVERT には、2 とおりの構文形式があります。両方の形式が、DATE、TIME、および TIMESTAMP と POSIXTIME のタイムスタンプ・データ型との相互変換、およびその他のデータ型間での変換をサポートします。
VARCHAR に値を CAST または CONVERT する場合、マッピングの既定サイズは 30 文字です。サイズの指定がない VARCHAR を MAXLEN 1 にマッピングする場合でも同様です。この既定サイズの 30 文字は、InterSystems IRIS 以外のソフトウェア要件との互換性を保持するために提供されています。
データ型の優先順位
操作によって返すことができる値が複数存在し、それらの値のデータ型が複数にわたる場合は、InterSystems IRIS により、返り値に優先順位の最も高いデータ型が割り当てられます。例えば、NUMERIC データ型には INTEGER データ型として考えられる値がすべて含まれますが、INTEGER データ型には NUMERIC データ型として考えられる値がすべて含まれるわけではありません。したがって、NUMERIC の方が優先順位が上であり、INTEGER よりも包括的です。
例えば、CASE 文で返すことができる結果値のデータ型として INTEGER と NUMERIC がある場合、結果値がこのどちらであっても、実際に返される結果値のデータ型は必ず NUMERIC になります。
データ型の優先順位は、高いもの (最も包括的) から低いものの順に以下のとおりです。
LONGVARBINARY LONGVARCHAR VARBINARY VARCHAR GUID TIMESTAMP DOUBLE NUMERIC BIGINT INTEGER DATE TIME SMALLINT TINYINT BIT
データ型の正規化および検証
%Library.DataTypeOpens in a new tab スーパークラスには、特定のデータ型のサブクラスがあります。これらのデータ型クラスには、入力値をデータ型形式に正規化するための Normalize() メソッド、入力値がそのデータ型に有効かどうかを判断するための IsValid() メソッド、および LogicalToDisplay() や DisplayToLogical() などのさまざまなモード変換メソッドが用意されています。
以下の例では、%TimeStamp データ型のための Normalize()Opens in a new tab メソッドを示しています。
SET indate=64701
SET tsdate=##class(%Library.TimeStamp).Normalize(indate)
WRITE "%TimeStamp date: ",tsdate
SET indate="2018-2-22"
SET tsdate=##class(%Library.TimeStamp).Normalize(indate)
WRITE "%TimeStamp date: ",tsdate
以下の例では、%TimeStamp データ型のための IsValid()Opens in a new tab メソッドを示しています。
SET datestr="July 4, 2018"
SET stat=##class(%Library.TimeStamp).IsValid(datestr)
IF stat=1 {WRITE datestr," is a valid %TimeStamp",! }
ELSE {WRITE datestr," is not a valid %TimeStamp",!}
SET leapdate="2016-02-29 00:00:00"
SET noleap="2018-02-29 00:00:00"
SET stat=##class(%Library.TimeStamp).IsValid(leapdate)
IF stat=1 {WRITE leapdate," is a valid %TimeStamp",! }
ELSE {WRITE leapdate," is not a valid %TimeStamp",!}
SET stat=##class(%Library.TimeStamp).IsValid(noleap)
IF stat=1 {WRITE noleap," is a valid %TimeStamp",! }
ELSE {WRITE noleap," is not a valid %TimeStamp",!}
クエリ・メタデータを使用して返されるデータ型
ダイナミック SQL を使用すると、クエリ内で指定した列のデータ型など、クエリに関するメタデータが返されます。
以下のダイナミック SQL の例は、Sample.Person および Sample.Employee 内の各列に対する ODBC データ型の列名および整数コードを返します。
SET myquery="SELECT * FROM Sample.Person"
SET tStatement=##class(%SQL.Statement).%New()
SET tStatus=tStatement.%Prepare(myquery)
SET x=tStatement.%Metadata.columnCount
WHILE x>0 {
SET column=tStatement.%Metadata.columns.GetAt(x)
WRITE !,x," ",column.colName," ",column.ODBCType
SET x=x-1 }
WRITE !,"end of columns"
SET myquery="SELECT * FROM Sample.Employee"
SET tStatement=##class(%SQL.Statement).%New()
SET tStatus=tStatement.%Prepare(myquery)
SET x=tStatement.%Metadata.columnCount
WHILE x>0 {
SET column=tStatement.%Metadata.columns.GetAt(x)
WRITE !,x," ",column.colName," ",column.ODBCType
SET x=x-1 }
WRITE !,"end of columns"
ODBC では ObjectScript の %List データ型値をコンマで区切られた値の文字列で表すので、リスト構造化されたデータ (Sample.Person 内の FavoriteColors 列など) は、データ型 12 (VARCHAR) を返します。
ストリーム・データ (Sample.Employee 内の Notes 列や Picture 列など) は、データ型 -1 (LONGVARCHAR) または -4 (LONGVARBINARY) を返します。
%Library.RowVersion は %Library.BigInt のサブクラスであるため、ROWVERSION フィールドはデータ型 -5 を返します。
詳細は、"ダイナミック SQL の使用" および "%SQL.StatementOpens in a new tab" を参照してください。
データ型の整数コード
クエリ・メタデータなどのコンテキストでは、列に定義されたデータ型が整数コードで返される場合があります。CType (クライアント・データ型) 整数コードは、%SQL.StatementColumnOpens in a new tab clientTypeOpens in a new tab プロパティにリストされます。詳細は、"select-item のメタデータ" を参照してください。
SQLType データ型コードは ODBC と JDBC で使用されます。前述の例で示すように、ODBC データ型コードは %SQL.Statement.%Metadata.columns.GetAt() メソッドで返されます。SQL シェル・メタデータは ODBC データ型コードも返します。JDBC のコードと ODBC のコードはほぼ同じですが、日付と時刻のデータ型の表現が異なります。これらの ODBC および JDBC の値は以下のとおりです。
ODBC | JDBC | データ型 |
-11 | -11 | GUID |
-7 | -7 | BIT |
-6 | -6 | TINYINT |
-5 | -5 | BIGINT |
-4 | -4 | LONGVARBINARY |
-3 | -3 | VARBINARY |
-2 | -2 | BINARY |
-1 | -1 | LONGVARCHAR |
0 | 0 | 不明な型 |
1 | 1 | CHAR |
2 | 2 | NUMERIC |
3 | 3 | DECIMAL |
4 | 4 | INTEGER |
5 | 5 | SMALLINT |
6 | 6 | FLOAT |
7 | 7 | REAL |
8 | 8 | DOUBLE |
9 | 91 | DATE |
10 | 92 | TIME |
11 | 93 | TIMESTAMP |
12 | 12 | VARCHAR |
詳細は、"ダイナミック SQL の使用" を参照してください。
InterSystems IRIS は、中国語、ヘブライ語、日本語、韓国語のロケールなど、マルチバイトの文字セットを使用する ODBC アプリケーション向けに Unicode SQL タイプもサポートします。
ODBC | データ型 |
-10 | WLONGVARCHAR |
-9 | WVARCHAR |
この機能を有効にする方法については、"ODBC データ・ソースとしての InterSystems データベースの使用法 (Windows)" を参照してください。