レコードは、様々な型のデータ値を格納できるコンポジット変数で、C、C++またはJavaのstruct
型に似ています。
PL/SQLのレコードは、表の行から取り出したデータや特定の列を保持する場合に便利です。 新しいレコード型を作成するかわりに、変数をtable%ROWTYPEまたはcursor%ROWTYPEとして宣言して、メンテナンスを容易にできます。
構文
record_type_definition ::=
record_field_declaration ::=
record_type_declaration ::=
キーワードとパラメータの説明
datatype
データ型指定子です。 datatype
の構文は、「定数」を参照してください。
expression
変数、定数、リテラル、演算子、ファンクション・コールの組合せです。 最も単純な式は、1個の変数で構成されています。 expression
の構文は、「式」を参照してください。 宣言がPL/SQLコンパイラによって処理されるとき、expression
の値がフィールドに代入されます。 その値とフィールドのデータ型には互換性が必要です。
field_name
ユーザー定義のレコード内のフィールドを識別します。
実行時に、NOT
NULL
として定義されたフィールドにNULLを代入しようとすると、事前定義の例外VALUE_ERROR
が呼び出されます。 NOT
NULL
制約の後には初期化句が続く必要があります。
record_name
ユーザー定義のレコードを識別します。
type_name
データ型指定子RECORD
を使用して定義されたユーザー定義のレコード型を識別します。
:= | DEFAULT
フィールドをデフォルト値に初期化します。
使用上の注意
RECORD
型定義とユーザー定義レコードの宣言は、任意のブロック、サブプログラムまたはパッケージの宣言部でできます。
次に示すように、レコードを宣言の中で初期化できます。 %TYPE
属性を使用して、フィールドのデータ型を指定できます。 また、フィールド宣言にNOT
NULL
制約を加えて、フィールドにNULLを代入できないようにすることもできます。 NOT
NULL
と宣言されたフィールドは、初期化されている必要があります。 レコード中の個のフィールドを参照する場合は、ドット表記法を使用します。 たとえば、dept_rec
レコードのdname
フィールドを参照するには、dept_rec
.dname
を使用します。
レコード中の個のフィールドに別に値を代入するかわりに、すべてのフィールドに値を一度に代入できます。
2つのユーザー定義レコードのデータ型が同じであれば、一方のレコードをもう一方のレコードに代入できます。 (正確に一致するフィールドが含まれているのみでは不十分です。) フィールドの数と順序が同じで、対応するフィールドのデータ型に互換性があれば、%ROWTYPE
レコードをユーザー定義のレコードに代入できます。
SELECT
文またはFETCH
文を使用して列の値をフェッチし、レコードに代入できます。 選択リストの列が、レコード中のフィールドと同じ順序で並ぶようにしてください。
ユーザー定義のレコードは、通常の有効範囲規則とインスタンス化の規則に従います。 パッケージの中では、そのパッケージが初めて参照された時点でインスタンスが生成され、データベース・セッションが終わった時点で消滅します。 ブロックまたはサブプログラムでは、ブロックまたはサブプログラムに入るときにインスタンス化され、ブロックまたはサブプログラムを終了すると消去されます。
スカラー変数と同様に、ユーザー定義のレコードもプロシージャやファンクションの仮パラメータとして宣言できます。 スカラー・パラメータに適用されるのと同じ制限が、ユーザー定義のレコードにも適用されます。
ファンクション仕様部のRETURN
句内にRECORD
型を指定できます。 こうすると、ファンクションは同じ型のユーザー定義のレコードを戻します。 ユーザー定義のレコードを戻すファンクションを起動する場合、次の構文を使用してレコード内のフィールドを参照します。
function_name(parameter_list).field_name
ネストしたフィールドを参照するには、次の構文を使用します。
function_name(parameter_list).field_name.nested_field_name
ファンクションがパラメータを取らない場合は、空のパラメータ・リストをコーディングします。 次に構文を示します。
function_name().field_name
関連トピック