create type - 新しい基本データ型を定義します
create type typename (internallength = (number | variable),
[ externallength = (number | variable), ]
input = input_function,
output = output_function
[, element = typename]
[, delimiter = <character>]
[, default = string ]
[, send = send_function ]
[, receive = receive_function ]
[, passedbyvalue])
create type でユーザが Postgres に新しいデータ型を登録し、現在のデータベースで使えるようにできます。型を定義したユーザがその所有者になります。typenameは新しい型の名前で、このデータベースで定義されている型と重複してはいけません。
create type は型の定義の前に (function(l) を使って) 登録されている 2つの関数を必要とします。新しい基本型の表現は、その型に定義されている演算子と関数から使うことのできる、型の外部表現を内部表現に変換するinput_functionで定義されます。当然、output_functionはその逆のことを行います。入力と出力の関数は両方とも"opaque"型の 1つあるいは 2つの引数を取るように定義されていなくてはなりません。
新しい基本データ型は固定長もしくは可変長の長さを取れ、固定長の時には、 internallength が正の整数に、また可変長の時にはPostgres はその新しい型が Postgres の提供するデータ型 "text" と同じフォーマットであると仮定します。型が可変長であると示すには、 internallength をvariableにセットしてください。外部表現は同様にexternallengthキーワードを使って指定します。
型が配列であるいは配列の要素であると示すためには、 element キーワードを使って配列の要素の型であることを示してください。例えば 4バイト整数 ("int4") の配列を定義するには、
element = int4
と指定してください。
この型の配列に使う区切り文字を示すのに、 delimiter を特定の文字にセットすることができます。デフォルトの区切り文字はコンマ(",")文字です。
ユーザがある特別なビットパターンを "データがない"ことを意味するようにしたいような場合には、 デフォルト 値がオプションとして利用できます。
オプションの関数send_functionとreceive_functionは、アプリケーションプログラムが違うマシンの Postgres にサービスを要求した時に使われます。このケースでは、Postgres が走るマシンはリモートのマシンとは違うデータ型のフォーマットを使っているかもしれません。この場合、サーバからクライアントに 送る(send) 時にデータ項目を標準的なフォーマットに変換し、またサーバがクライアントからデータを 受け取る(receive) 時に標準的なフォーマットからマシン特有のフォーマットに変換するのが適切です。これらの関数が指定されなければ、その型の内部フォーマットはすべての関連するマシンアーキテクチャで受け入れ可能なものであると考えます。例えば、単一文字は Sun-4 から DECstation に送られたとしても変換する必要はありませんが、多くの他の型についてはそうではありません。
オプションの passedbyvalue フラッグはこのデータ型を使う演算子と関数は引数を参照渡しではなく値渡しで引き渡すということを示します。型の内部表現が最大 4バイトであるものだけが値渡しで引き渡すことができます。
新しい基本型に関してこの節で説明された適切な方法でユーザは演算子と関数と集約関数を定義できます。
2つの一般化された組み込み関数 array_in と array_out が可変長の配列型を素早く作るために存在しています。これらの関数は既存の Postgres の型ならどれでもその配列を操作できます。
"通常の" Postgres の型は 8192 バイトの長さしか取れません。もしもっと大きな型が必要なら、巨大オブジェクト型を作らなくてはなりません。これらの型へのインタフェイスは 第 7 節の巨大オブジェクトインタフェイスで充分に検討しました。すべての巨大オブジェクト型は常にvariableです。つまり、巨大オブジェクトの internallength は常に -1 ということです。
-- -- このコマンドは box データ型を作って、その型をクラスの定義に -- 使っています。 -- create type box (internallength = 8, input = my_procedure_1, output = my_procedure_2)
create table MYBOXES (id = int4, description = box)
--
-- このコマンドは整数の要素を持つ可変長の配列を作ります。
--
create type int4array
(input = array_in, output = array_out,
internallength = variable, element = int4)
create table MYARRAYS (id = int4, numbers = int4array)
--
-- このコマンドは巨大オブジェクト型を作って、その型をクラスの
-- 定義に使っています。
--
create type bigobj
(input = lo_filein, output = lo_fileout,
internallength = variable)
create table BIG_OBJS (id = int4, obj = bigobj)
型の名前は下線文字 ("_")で始まってはいけません。また、15文字を越えてはいけません。これは Postgres が、名前を基本型の名前の前に下線を付けて各基本型についての配列型を黙って作っているからです。