このトピックでは、現在のデータベースに新しいカスタムデータ型を登録するために使用されるCREATE TYPEステートメントについて説明します。
背景情報
ユーザーは、CREATE TYPEステートメントを実行して、現在のデータベースに新しいカスタムデータ型を登録できます。 CREATE TYPEステートメントを実行するユーザーは、自動的に新しいデータ型の所有者になります。 CREATE TYPEステートメントを実行して、データベース内に特定の属性と動作を持つカスタムデータ構造を作成できます。
CREATE TYPEステートメントの実行時にスキーマ名を指定すると、そのステートメントによって作成された新しいデータ型が指定されたスキーマに作成されます。 それ以外の場合、新しいデータ型はデフォルトで現在のスキーマに作成されます。
新しいデータ型の名前は、同じスキーマ内で一意である必要があります。 つまり、新しい型の名前は、同じスキーマ内の既存の型またはドメインの名前とは異なる必要があります。 また、テーブルにはデータ型が関連付けられているため、型名は同じスキーマ内の既存のテーブルの名前とは異なる必要があります。 したがって、潜在的な命名の競合を避けるために、型名はスキーマ内で一意のままでなければなりません。
次の構文に示すように、CREATE TYPEステートメントには5つのバリアントがあります。 バリアントは、複合型、列挙型、範囲型、基本型、およびシェル型のデータ型を作成します。 このトピックでは、最初の4つのデータ型を作成する方法について説明します。 シェル型は、さらに定義されるデータ型の名前を予約するために使用されるプレースホルダーです。 プレースホルダーは、パラメーターを追加せずに型名のみを含むCREATE TYPEステートメントを発行することで作成できます。 範囲型と基本型を作成する場合、型を定義する前に型の存在を事前に宣言するための前方参照としてシェル型が使用されます。
構文
CREATE [ OR REPLACE ] TYPE名AS
( [ attribute_name data_type [ COLLATE collation ] [, ... ] ] );
ENUMとしてのTYPE名の作成
( [ 'label' [, ... ] ] );
TYPE名をRANGEとして作成 (
SUBTYPE=サブタイプ
[ , SUBTYPE_OPCLASS = subtype_operator_class]
[ , COLLATION = collation]
[ , CANONICAL = canonical_function]
[ , SUBTYPE_DIFF = subtype_diff_function]
);
CREATE TYPE名 (CREATE TYPE name)
INPUT = input_function,
OUTPUT = output_function
[ , RECEIVE = receive_function]
[ , SEND = send_function]
[ , TYPMOD_IN = type_modifier_input_function]
[ , TYPMOD_OUT = type_modifier_output_function]
[ , ANALYZE = analyze_function]
[, INTERNALENGTH={INTERNALLENGTH | 可変}]
[, パスワード値]
[ , ALIGNMENT = alignment]
[ , STORAGE = storage]
[ , LIKE = like_type]
[ , CATEGORY = category]
[ , PREFERRED = preferred]
[ , DEFAULT=デフォルト]
[ , ELEMENT=要素]
[ , DELIMITER = delimiter]
[ , COLLATABLE=colattable]
);
CREATE TYPE名; 合成のタイプ
CREATE TYPEステートメントの最初のバリアントを使用して、複合型を作成できます。 複合型は、属性名のセットで構成されます。 各属性名は、特定のデータ型に関連付けられています。 属性に関連付けられたデータ型がソート操作をサポートしている場合は、各属性にソートルールを指定できます。 複合タイプは、テーブル構造の行タイプに似ています。 CREATE TYPEステートメントを実行して複合型を作成すると、実際に完全なテーブルを作成せずにさまざまな方法で使用できる構造化データ型を定義できます。
複合型を作成するときは、OR REPLACE句を使用できます。 OR REPLACE句を使用すると、既存の型は、データベース内で同じ名前を持つ新しく定義された型に置き換えられます。 これにより、既存の型を事前に削除することなく、既存の複合型の定義を更新できます。 これにより、タイプメンテナンスのプロセスが簡素化されます。
OR REPLACE句を使用する場合は、句が元の型の定義を上書きするため、注意して続行してください。 上書き操作は、タイプに依存するデータベースオブジェクトに影響を与える可能性があります。
複合型は、関数のパラメーターと戻り値の型として使用でき、構造のテーブルを作成する必要なしに複雑な構造を定義する便利な方法を提供します。 これにより、複数の値を全体として渡す必要がある場合や、関数が単純なデータ型の値だけでなく複数の値を返す必要がある場合は特に、データベースの複合型の柔軟性と実用性が保証されます。
複合型を正常に作成するには、複合型のすべての属性に関連付けられているデータ型に対するUSAGE権限が必要です。
列挙型
CREATE TYPEステートメントの2番目のバリアントを使用して、列挙型を作成できます。 列挙型は、引用符で囲む必要がある一連の定義済みタグで構成されます。 各タグの長さは、NAMEDATALENフィールドで指定された上限を超えることはできません。 通常、タグの長さは64バイトです。
タグを含まない列挙型を作成できます。 ただし、このような型に対してALTER typeステートメントを実行して型に少なくとも1つのタグを追加する前に、このような型を使用して値を格納することはできません。 つまり、値のない列挙型は、列挙値をそのような型に追加する前にデータベース操作に使用できません。 これにより、列挙型の柔軟なスケーラビリティが保証されます。 このように、データベース設計者は、列挙型を最初に定義するときに、すべての可能な列挙値を直ちに決定する必要はない。 代わりに、アプリケーション要件の変更に応じて新しい列挙値を徐々に追加できます。
範囲タイプ
CREATE TYPEステートメントの3番目のバリアントを使用して、範囲型を作成できます。 rangeタイプは、サブタイプに基づいて値が定義される連続間隔を示します。 サブタイプは、範囲を構成する基本的なデータ型です。 サブタイプは、範囲内の値の順序を決定するためにBツリー演算子クラスに対応する必要があります。 ほとんどの場合、サブタイプのデフォルトのBツリー演算子クラスがソート基準として使用されます。 ソートにデフォルト以外の演算子クラスを使用する場合は、subtype_opclassオプションを使用してクラスの名前を指定できます。 サブタイプを並べ替えることができ、範囲型の値に対してデフォルトではない並べ替えルールを使用する必要がある場合は、照合順序オプションを使用してルールを指定できます。
範囲タイプを作成するときは、カノニカル関数を定義できます。 この関数は、範囲型のパラメーターを受け入れ、同じ型の正規化された値を返すオプションの関数です。 この関数は、範囲値を値の正準表現に変換するために使用されます。 ただし、範囲型が関数を宣言する前に関数を定義する必要があるため、正準関数を作成するときに問題が発生する場合があります。 正規関数を正常に作成するには、シェル型を作成する必要があります。 シェルタイプは、名前と所有者のみを含み、特定の属性は含まないプレースホルダータイプです。 追加のパラメーターを指定せずにCREATE TYPE nameステートメントを実行してシェル型を作成できます。 シェル型を作成した後、シェル型を使用してパラメーターの型を宣言し、カノニカル関数の値を返すことができます。 実際のレンジタイプがシェルタイプによって宣言されたものと同じである場合、システムは自動的にプレースホルダータイプ (シェルタイプ) を完全に定義されたレンジタイプに置き換えます。
または、subtype_diff関数を定義することもできます。 この関数は、2つのサブタイプ値をパラメーターとして受け取り、2つの値の差を示す倍精度型の値を返します。 subtype_diff関数はオプションです。 ただし、範囲タイプの列のGiSTインデックスの効率を向上させることができます。
基本タイプ
CREATE TYPEステートメントの4番目のバリアントは、基本型を作成するために使用されます。 基本型はスカラー型とも呼ばれます。 基本タイプの作成には、特権権限が必要です。 したがって、セキュリティを確保するには、現在のデータベースのスーパーユーザーである必要があります。 基本タイプが不適切に定義されていると、サーバーは予期しない操作を実行し、クラッシュする可能性があります。
新しい基本型を定義するときは、任意の順序でパラメーターを指定できます。 ほとんどのパラメータはオプションです。 ただし、新しい基本型を定義する前に、CREATE FUNCTIONステートメントを実行して、少なくとも2つの関数を登録する必要があります。 新しい基本型を作成するときは、input_function関数とoutput_function関数が必要です。 receiv_function、send_function、type_modifier_input_function、type_modifier_output_function、およびanalye_functionの関数はオプションです。
ほとんどの場合、前述の関数はCプログラミング言語またはその他の低レベル言語で記述する必要があります。これらの関数は、入力、出力、受信、送信、データ型の分析などの操作を処理するために、基礎となるデータベースシステムと密接に連携する必要があるためです。 これらの関数の作成と登録は、新しい基本型を作成するプロセスの最も技術的な部分です。これにより、新しい基本型がデータベースシステムで適切に機能することも保証されます。
input_function関数は、ユーザー定義型の外部テキスト表現を、その型によって定義されたすべての演算子および関数に適用される内部表現に変換します。 output_function関数は、内部表現が読み取り可能なテキスト表現に変換される逆変換プロセスを実行する。 input_function関数は、型がcgringのパラメーター、または型がそれぞれcgring、oid (オブジェクト識別子) 、integerの3つのパラメーターを受け取ります。 文字列型のパラメーターは、入力テキストのC文字列表現です。 oid型のパラメーターは、基本型のオブジェクト識別子 (OID) または配列内の要素の型です。 整数型のパラメーターは、列の型修飾子 (typmod) です。 型修飾子が不明の場合、値 -1が渡されます。 input_function関数は、新しい基本型の値を返す必要があります。 ほとんどの場合、input_function関数はSTRICTとして宣言されます。 NULLが入力された場合、関数は呼び出されません。 input_function関数がSTRICTとして宣言されていない場合、NULLが入力されると、関数の最初のパラメーターはNULLになります。 この場合、エラーが発生しない限り、input_function関数はNULLを返します。 このデザインは、入力値としてNULLを受け入れないドメイン入力関数をサポートします。
output_function関数は、新しい型のパラメーターを受け入れ、そのパラメーターをcgring型の戻り値に変換する必要があります。 output_function関数が値NULLを返した場合、関数は呼び出されません。
receiv_function関数は、基本型の外部バイナリ表現を処理し、外部表現を内部表現に変換する。 関数が提供されていない場合、基本型のバイナリ表現は入力できません。 バイナリ表現はより高い効率を提供し、異なるシステム間で容易に移行することができる。 たとえば、標準の整数型はネットワークバイト順序を外部バイナリ表現として使用し、内部表現はマシンのローカルバイト順序を使用します。 receive_function関数は、入力値が有効かどうかを検証し、型がinternalのパラメーター、または型がそれぞれinternal、oid、integerの3つのパラメーターを受け入れる必要があります。 internal型のパラメーターは、受信したバイト文字列を含むStringInfoバッファーを指定します。 oid型のパラメーターとinteger型のパラメーターは、input_function関数と一致しています。 ほとんどの場合、receive_function関数はSTRICTとしても宣言されます。 それ以外の場合、内部関数が入力値NULLを受け取ると、内部型のパラメーターはNULLになり、エラーが発生しない限り関数はNULLを返します。
send_function関数は、内部表現を外部バイナリ表現に変換する。 send_function関数が指定されていない場合、基本型のバイナリ表現は出力できません。 send_function関数は、新しい型のパラメーターを受け入れ、bytea型の値を返す必要があります。 値NULLが返された場合、send_function関数は呼び出されません。 send_function関数は、ユーザー定義型が内部データベースシステムと対話するための経路を提供します。これにより、型がデータベースのストレージおよび通信メカニズムに適合できるようになります。
input_function関数とoutput_function関数は、戻り値またはパラメーターとして作成されていない新しい型を参照するため、新しい型を作成する前に宣言する必要があります。 この問題を解決するには、シェルタイプを定義する必要があります。 シェル型を定義するには、追加のパラメーターを含まないCREATE type名ステートメントを実行します。 次に、Cプログラミング言語で記述されたinput_function関数とoutput_function関数を呼び出して、シェル型を参照できます。 最後に、データ型の完全な定義を含むCREATE TYPEステートメントを実行して、シェル型を完全で合法的な型定義に置き換えることができます。 置換後、新しいタイプはデータベース操作で使用可能になります。
基本型が型宣言にアタッチされたオプションの制約として機能する型修飾子 (char(5) やnumeric(30,2) など) をサポートしている場合、type_modifier_input_functionおよびtype_modifier_output_function関数を定義する必要があります。 PolarDBでは、ユーザー定義型は1つ以上の単純な定数または識別子を修飾子として受け入れることができます。 情報をシステムディレクトリに格納するには、修飾子を負でない整数値にカプセル化できる必要があります。 型修飾子は、type_modifier_input_function関数によって受け入れられます。 この関数は、宣言された修飾子をcgring型の配列として受け取り、有効性チェックを実行する必要があります。 修飾子が無効な場合、type_modifier_input_function関数はエラーをスローします。 修飾子が有効な場合、関数はtypmod列に格納されている負でない整数を返します。 基本型にtype_modifier_input_function関数で指定された制約がない場合、型修飾子はすべて拒否されます。
この場合、type_modifier_output_function関数は、システムディレクトリに格納されている整数値typmodを読み取り可能な表現に変換します。 type_modifier_output_function関数は、型名の末尾にアタッチされたcgring型の文字列を返す必要があります。 たとえば、type_modifier_output_functionは、numeric型の値 (30,2) を返します。 既定の表現で、格納されている整数値typmodを括弧で囲む場合は、type_modifier_output_function関数を省略できます。 type_modifier_output_function関数は、ユーザー定義型が型修飾子を解析および表示するためのパスウェイを提供します。 これにより、型宣言で追加のカスタム制約を指定できます。
analyze_function関数は、基本型の統計を収集します。 デフォルトでは、基本型にデフォルトのBツリー演算子クラスがある場合、ANALYZEは基本型のequalsおよびless-than演算子を使用して統計を収集しようとします。 ただし、この方法は非スカラー型には適していません。 したがって、カスタム解析関数を指定することで、デフォルトの動作を置き換えることができます。 カスタム解析関数は、internal型の単一のパラメーターを宣言し、boolean型の値を返す必要があります。
新しい型に対して作成されたI/O関数およびその他の関数のみが、型の内部表現の詳細を受け取ります。 ただし、内部表現の一部の属性はPolarDBに宣言する必要があります。 最も重要な属性は内部です長さ。 基本タイプの長さは固定または可変です。 型の長さが固定されている場合、internallength属性値は正の整数になります。 タイプの長さが可変の場合、内部可変長ベースタイプのinternallength属性はvariableに設定され、typlenは -1に設定されます。 可変長ベース型の内部表現は、型の全長を表す4バイトの整数で始まる必要があります。
PASSEDBYVALUEは、参照ではなく値によって新しい型を渡す必要があることを示します。 PASSEDBYVALUEを使用する場合は、基本型の長さを固定する必要があり、型の内部表現のバイト数はDatum型の上限を超えることはできません。 上限は、いくつかのシステムでは4バイトであり得、他のシステムでは8バイトであり得る。
alignmentパラメータは、ベースタイプのメモリアライメント要件を定義します。 基本タイプのメモリは、1バイト、2バイト、4バイト、または8バイトの境界に基づいて整列できます。
alignmentパラメーターの値は、すべての可変長型に対して4以上である必要があります。これは、型が内部表現のヘッダー要素としてint4型の長さの値を含める必要があるためです。
storageパラメーターは、可変長タイプのストレージポリシーを指定します。 固定長タイプは、プレーンポリシーのみをサポートします。 つまり、プレーン型のデータは常に行に格納され、圧縮されません。 拡張ポリシーでは、長すぎるデータ値を圧縮し、必要に応じてプライマリテーブル行からデータを削除するようにシステムを指定します。 外部ポリシーでは、行からデータを削除できます。 しかし、システムはデータを圧縮しようとはしない。 メインポリシーはデータ圧縮をサポートしています。 ただし、メインポリシーはプライマリテーブル行からデータを削除しません。 メインポリシーが適用されるデータは、行サイズを許容範囲内に保つために他の方法が利用できない場合にのみ削除されます。 メインポリシーは、拡張ポリシーと外部ポリシーよりも行のデータを保持することを優先します。
plainを除くすべてのstorageオプションでは、基本型の関数がthe Oversized-Attribute Storage Technique (TOAST) を使用して処理された値を処理できることを指定します。 これらの値は、TOAST互換データ型を使用する列のデフォルトのTOASTストレージ戦略のみを決定します。 ALTER TABLE SET STORAGEステートメントを実行して、列の他のストレージポリシーを指定できます。
like_typeパラメーターは、既存の基本型に基づいて新しい基本型の基本属性を定義するメソッドを提供します。 このメソッドを使用すると、既存の基本型の属性を直接コピーできます。 internallength、passedbyvalue、alignment、およびstorage属性の値は、既存のベースタイプからコピーされます。 これらの値は、LIKE句で上書きできます。 LIKE句を使用する必要はありません。 このメソッドは、新しい基本型の基になる実装が既存の基本型に依存する場合に、基本型の属性を指定するのに適しています。
カテゴリおよび好ましいパラメータは、曖昧さの場合に最適な暗黙的タイプ変換を決定する。 各データ型は、単一のASCII文字で命名されたカテゴリに割り当てられる。 各タイプは、それが属するカテゴリ内の好ましいタイプになることができる。 オーバーロードされた関数または演算子が曖昧さを解消する必要がある場合、パーサは優先型への変換を優先する。 パーサーは、同じカテゴリ内でのみ型変換を実行します。 他の型に暗黙的に変換されていない型、または他の型からの暗黙的な変換を受け入れない型の場合は、これらの設定の既定値を維持できます。 暗黙的に変換された関連型のグループについては、型を同じカテゴリに属するものとしてマークし、同じカテゴリの最初の選択肢として最も一般的に使用される型を1つまたは2つ選択することをお勧めします。 categoryパラメーターは、数値や文字列カテゴリなどの既存の組み込みカテゴリにユーザー定義型を追加する場合に特に必要です。 完全にユーザー定義の型で構成されるカテゴリを作成することもできます。 このようなカテゴリの識別として、大文字以外のASCII文字を選択できます。
配列型の列にnull以外のデフォルト値を設定する場合は、デフォルト値を指定できます。 DEFAULTキーワードを使用して、デフォルト値を指定できます。 既定値は、指定した列にアタッチされている明示的なdefault句で上書きできます。
データ型を配列型として定義するには、ELEMENTキーワードを使用して配列の基本要素型を示します。 たとえば、4バイトの整数int4に基づく配列型を定義するには、ELEMENT = int4を指定します。
外部表現の配列の値を区切る区切り文字を指定するには、区切り文字を特定の文字に設定します。 デフォルトの区切り文字はコンマ (,) です。
区切り文字は、配列の要素型に依存しますが、配列型には依存しません。
オプションのパラメーターcollectableがtrueに設定されている場合、配列型の列定義と式は、COLLATE句を使用して照合情報を保持できます。 照合可能パラメータがtrueに設定されている関数は、実際にこの情報を使用する必要があります。 タイプをソート可能としてマークするだけでは、関数がこの情報を自動的に使用するわけではありません。
配列タイプ
新しい型を定義すると、PolarDBは新しい型に対応する配列型を自動的に作成します。 配列タイプ名は、元の要素タイプの名前の前にアンダースコア (_) を付けることによって自動的に生成されます。 配列タイプ名のバイト数がNAMEDATALENで指定された上限を超えると、名前は自動的に切り捨てられます。 切り捨てられた名前が既存の型の名前と競合する場合、PolarDBは、競合を引き起こさない名前が見つかるまで別の名前を試行します。
暗黙的に作成される配列型の長さは可変です。 配列型は、組み込みの入出力関数array_inおよびarray_outを使用します。 配列型は、その要素型の所有権またはスキーマによって異なります。 対応する要素タイプが削除されると、配列タイプも削除されます。 これにより、型システムの一貫性とシンプルさを確保し、配列型を手動で作成および管理する必要がなくなります。
PolarDBは、ユーザー定義型に対応する配列型を自動的に作成します。 ただし、基本的に複数の同じ要素の配列である固定長型を作成する場合は、ELEMENTオプションが引き続き必要です。 型に包括的な操作を提供し、サブスクリプトを使用して配列内の個々の要素に直接アクセスできるようにするとします。 たとえば、point型には内部に2つの浮動小数点数が含まれており、2つの座標値にはpoint[0] とpoint[1] の添字を使用して直接アクセスできます。
添字ベースのアクセス機能は、内部構造が一連の固定長フィールドである固定長タイプにのみ適用できます。 ただし、array_inおよびarray_out関数を使用して添え字ベースのアクセスをサポートするには、添え字には可変長型の一般的な内部式が必要です。 固定長配列型のサブスクリプトは、歴史的な理由によりゼロから始まります。 対照的に、可変長配列タイプの添え字は1から始まります。
Parameters
パラメーター | 説明 |
| 作成するタイプの名前。 タイプ名は、スキーマによって修飾できます。 |
| 複合型の属性 (列) の名前。 |
| 列の既存の型の名前。 |
| 列または範囲に関連付けられている、または複合型に関連付けられている既存の照合順序の名前。 |
| 列挙型の特定の値のテキストラベルを表すテキスト文字列。 列挙型の定義では、各値はラベルで一意に表されます。 |
| 範囲型の要素型の名前。 range型は、要素型の値の範囲を表します。 |
| 範囲型の要素型で使用されるBツリー演算子クラスの名前。 |
| 範囲型の正規化された関数の名前。 |
| 範囲型の2つの要素の差を計算する関数です。 |
| 型の外部テキスト表現から内部表現にデータを変換する関数。 |
| 型の内部表現から外部テキスト表現にデータを変換する関数。 この関数は、 |
| 型の外部バイナリ表現から内部表現にデータを変換する関数。 |
| 型の内部表現から外部バイナリ表現にデータを変換する関数。 |
| 型のモディファイヤ配列を内部表現に変換する関数。 |
| 型の内部修飾子表現を外部テキスト表現に変換する関数。 |
| 型の統計分析を実行する関数です。 |
| 新しい型の内部表現の長さをバイト単位で指定する数値定数。 デフォルトでは、その長さは可変です。 |
| タイプのストレージ配置要件。The storage alignment requirements for the type. 有効な値: |
| タイプのストレージ戦略。The storage strategy for the type. 有効な値: |
| 新しい型と同じ内部表現を持つ既存の型の名前。 |
| タイプのカテゴリコード ( |
| タイプがカテゴリで優先されることを指定します。 このパラメーターがtrueに設定されている場合、型はそのカテゴリで優先されます。 有効な値は、true および false です。 デフォルト値:false 既存のタイプカテゴリに優先タイプを追加する場合は注意が必要です。 好ましいタイプの追加は、予期しない挙動変化を引き起こす可能性がある。 |
| 型のデフォルト値。 このパラメーターを指定しない場合、このパラメーターはデフォルトで空です。 |
| 作成する配列型の要素の型。 |
| 配列型の配列内の値を区切るために使用される区切り文字。 |
| 照合情報を使用できるかどうかを指定します。 このパラメーターがtrueに設定されている場合、情報は利用可能です。 有効な値は、true および false です。 デフォルト値:false |
使用上の注意
型とテーブルに名前を付けるときは、アンダースコアで始まる名前を使用しないことをお勧めします。 データベースは、競合を防ぐために自動生成された配列型の名前を変更するメカニズムを実装します。 ただし、潜在的な混乱のリスクは依然として存在します。 ほとんどの場合、アンダースコアで始まる名前は、アンダースコア (_) が前に付けられた基本型名で構成される配列型名など、データベースシステムによって生成される名前として使用されます。 したがって、不必要な混乱を減らし、命名を明確かつ一貫性のあるものにするために、この命名方法を使用しないことをお勧めします。
例
複合型を作成し、後続の関数定義で戻り値の型として使用します。
CREATE TYPE compfoo AS (f1 int, f2テキスト);
CREATE FUNCTION getfoo() RETURNS SETOF compfooとして $$$
SELECT fooid, fooname FROM foo
$$言語SQL; 新しい複合型を作成し、作成後に新しい型の定義を更新します。
CREATE TYPE compfoo AS (f1 int, f2テキスト);
CREATEまたはREPLACE TYPE compfoo AS (f2テキスト、f1 int); 列挙型を定義し、新しいテーブルの定義でその型を使用します。
CREATE TYPE bug_status AS ENUM ('new' 、'open' 、'closed');
CREATE TABLEのバグ (
idシリアル、
説明テキスト、
ステータスbug_status
); 範囲タイプを作成します。
CREATE TYPE float8_range AS RANGE (サブタイプ=float8、subtype_diff = float8mi);boxという名前の基本データ型を作成し、その型を新しいテーブルの定義の列のデータ型として使用します。
CREATE TYPEボックス;
CREATE FUNCTION my_box_in_function(cstring) リターンボックスAS ... ;
CREATE FUNCTION my_box_out_function (ボックス) を返します。CREATE TYPEボックス (
INTERNALENGTH=16、
INPUT = my_box_in_function、
OUTPUT = my_box_out_function
);
テーブルのmyboxesを作成する (
id整数、
説明ボックス
); boxの内部構造が4つのfloat4要素からなる配列である場合、次のステートメントを使用して型を定義できます。
CREATE TYPEボックス (
INTERNALENGTH=16、
INPUT = my_box_in_function、
OUTPUT = my_box_out_function、
ELEMENT = float4
); ラージオブジェクトタイプを作成し、テーブル定義でそのタイプを使用します。
CREATE TYPE bigobj (
INPUT = lo_filein、OUTPUT = lo_fileout、
INTERNALENGTH=可変
);
テーブルbig_objsの作成 (
id整数、
obj bigobj
);