5.6 修飾式の概要

修飾式を使用すると、複雑な値を簡潔な形式で、値が必要になった箇所で宣言および定義できるため、プログラムが明確になり開発者の生産性も向上します。

修飾式は式の要素を結合して、RECORD型または連想配列型の値を作成します。

修飾式は明示的な型の指定を使用することで修飾項目の型を指定します。この明示的な指定はtypemarkと呼ばれるものです。

修飾式の構文は次のとおりです。

qualified_expression ::= typemark ( aggregate )

aggregate ::= [ positional_choice_list ] [explicit_choice_list]

positional_choice_list ::= (expr )+

explicit_choice_list ::= named_choice_list | indexed_choice_list

named_choice_list ::= identifier => expr [,]+

indexed_choice_list ::= expr => expr [,] +

構文およびセマンティクスの詳細は、qualified_expression ::=を参照してください。

例5-8 修飾式を使用したRECORD型変数への値の代入

この例は、RECORD型変数の宣言、初期化および定義を示しています。パッケージpkg内でrec_t型が定義されていて、一部が初期化されています。その型を使用して変数v_rec1が宣言され、位置表記法を使用して初期値が代入されています。その型を使用して変数v_rec2が宣言され、名前関連付け構文を使用して初期値が代入されています。変数v_rec3にはNULL値が代入されています。プロシージャprint_recはローカル変数v_rec1の値を表示し、続いてプロシージャ・パラメータpi_rec変数値を表示します。プロシージャにパラメータが渡されない場合は、プロシージャ定義に設定されている初期値が表示されます。

Live SQL:

この例は、18c 修飾式を使用したRECORD型変数への値の代入のOracle Live SQLで表示および実行できます

CREATE PACKAGE pkg IS
  TYPE rec_t IS RECORD
   (year PLS_INTEGER := 2,
    name VARCHAR2 (100) );
END;
DECLARE
  v_rec1 pkg.rec_t := pkg.rec_t(1847,'ONE EIGHT FOUR SEVEN');
  v_rec2 pkg.rec_t := pkg.rec_t(year => 1, name => 'ONE');
  v_rec3 pkg.rec_t := pkg.rec_t(NULL,NULL);

PROCEDURE print_rec ( pi_rec pkg.rec_t := pkg.rec_t(1847+1,  'a'||'b')) IS
  v_rec1 pkg.rec_t := pkg.rec_t(2847,'TWO EIGHT FOUR SEVEN');
BEGIN
  DBMS_OUTPUT.PUT_LINE(NVL(v_rec1.year,0) ||' ' ||NVL(v_rec1.name,'N/A'));
  DBMS_OUTPUT.PUT_LINE(NVL(pi_rec.year,0) ||' ' ||NVL(pi_rec.name,'N/A'));
END;
BEGIN
  print_rec(v_rec1);
  print_rec(v_rec2);
  print_rec(v_rec3);
  print_rec();
END;
2847 TWO EIGHT FOUR SEVEN
1847 ONE EIGHT FOUR SEVEN
2847 TWO EIGHT FOUR SEVEN
1 ONE
2847 TWO EIGHT FOUR SEVEN
0 N/A
2847 TWO EIGHT FOUR SEVEN
1848 ab

例5-9 修飾式を使用した連想配列型変数への値の代入

この例では、ファンクションを使用してBOOLEANの表の値を表示します。

Live SQL:

この例は、18c 修飾式を使用したRECORD型変数への値の代入のOracle Live SQLで表示および実行できます

CREATE FUNCTION print_bool (v IN BOOLEAN)
  RETURN VARCHAR2
IS
  v_rtn VARCHAR2(10);
BEGIN
  CASE v
  WHEN TRUE THEN
    v_rtn := 'TRUE';
  WHEN FALSE THEN
    v_rtn := 'FALSE';
  ELSE
    v_rtn := 'NULL';
  END CASE;
  RETURN v_rtn;
END print_bool;

変数v_aa1は索引キーと値のペアを使用して初期化されます。


DECLARE
  TYPE t_aa IS TABLE OF BOOLEAN INDEX BY PLS_INTEGER;
  v_aa1 t_aa := t_aa(1=>FALSE,
                     2=>TRUE,
                     3=>NULL);
BEGIN
  DBMS_OUTPUT.PUT_LINE(print_bool(v_aa1(1)));
  DBMS_OUTPUT.PUT_LINE(print_bool(v_aa1(2)));
  DBMS_OUTPUT.PUT_LINE(print_bool(v_aa1(3)));
END;
FALSE
TRUE
NULL