ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

レコード定義

レコードは、様々な型のデータ値を格納できるコンポジット変数で、C、C++またはJavaのstruct型に似ています。

PL/SQLのレコードは、表の行から取り出したデータや特定の列を保持する場合に便利です。 新しいレコード型を作成するかわりに、変数をtable%ROWTYPEまたはcursor%ROWTYPEとして宣言して、メンテナンスを容易にできます。

構文

record_type_definition ::=

record_type_definition
record_type_definition.gifの説明

record_field_declaration ::=

record_field_declaration
record_field_declaration.gifの説明

record_type_declaration ::=

record_type_declaration
record_type_declaration.gifの説明

キーワードとパラメータの説明

datatype

データ型指定子です。 datatypeの構文は、「定数」を参照してください。

expression

変数、定数、リテラル、演算子、ファンクション・コールの組合せです。 最も単純な式は、1個の変数で構成されています。 expressionの構文は、「式」を参照してください。 宣言がPL/SQLコンパイラによって処理されるとき、expressionの値がフィールドに代入されます。 その値とフィールドのデータ型には互換性が必要です。

field_name

ユーザー定義のレコード内のフィールドを識別します。

NOT NULL

実行時に、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を使用します。

レコード中の個のフィールドに別に値を代入するかわりに、すべてのフィールドに値を一度に代入できます。

ユーザー定義のレコードは、通常の有効範囲規則とインスタンス化の規則に従います。 パッケージの中では、そのパッケージが初めて参照された時点でインスタンスが生成され、データベース・セッションが終わった時点で消滅します。 ブロックまたはサブプログラムでは、ブロックまたはサブプログラムに入るときにインスタンス化され、ブロックまたはサブプログラムを終了すると消去されます。

スカラー変数と同様に、ユーザー定義のレコードもプロシージャやファンクションの仮パラメータとして宣言できます。 スカラー・パラメータに適用されるのと同じ制限が、ユーザー定義のレコードにも適用されます。

ファンクション仕様部のRETURN句内にRECORD型を指定できます。 こうすると、ファンクションは同じ型のユーザー定義のレコードを戻します。 ユーザー定義のレコードを戻すファンクションを起動する場合、次の構文を使用してレコード内のフィールドを参照します。

function_name(parameter_list).field_name

ネストしたフィールドを参照するには、次の構文を使用します。

function_name(parameter_list).field_name.nested_field_name

ファンクションがパラメータを取らない場合は、空のパラメータ・リストをコーディングします。 次に構文を示します。

function_name().field_name

関連トピック