パッケージは、次の 2 つの主要コンポーネントで構成されています。
  • パッケージ仕様:公開インターフェースです。 これは、パッケージの外部で参照できる要素です。 仕様では、パッケージの一部となるすべてのデータベースオブジェクトを宣言しています。
  • パッケージ本体:パッケージ仕様内で宣言されたすべてのデータベースオブジェクトの具体的な実装が含まれます。

パッケージ本体は、パッケージ仕様の詳細を実装しています。 実装の詳細と、アプリケーションからは見えないプライベート宣言が含まれています。 仕様を変更せずに、パッケージ本体をデバッグ、拡張、または置換できます。 同様に、実装の詳細はアプリケーションから見えないため、呼び出し側プログラムを再コンパイルせずに本文を変更することができます。

パッケージ仕様構文

パッケージ仕様は、パッケージ (API) のユーザーから見えるインターフェイスを定義します。 仕様には、パッケージのユーザーから見える関数、プロシージャ、データ型、例外、およびカーソルがリストされています。

パッケージのインターフェースを定義するために使用される構文は次のとおりです。
CREATE [ OR REPLACE ] PACKAGE package_name
  [ authorization_clause ]
  { IS | AS }
  [ declaration; ] ...
  [ procedure_or_function_declaration; ] ...
END [ package_name ] ;
ここで authorization_clause :=
{ AUTHID DEFINER } | { AUTHID CURRENT_USER }
ここで procedure_or_function_declaration :=
procedure_declaration | function_declaration
ここで procedure_declaration :=
PROCEDURE proc_name [ argument_list ] [ restriction_pragma ];
ここで function_declaration :=
FUNCTION func_name [ argument_list ]

RETURN rettype [ restriction_pragma ];
				
ここで argument_list :=
( argument_declaration [, ... ] )
ここで argument_declaration :=
argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
ここで restriction_pragma :=
PRAGMA RESTRICT_REFERENCES(name, restrictions)
ここで restrictions :=
restriction [, ... ]

パラメーター

パラメーター 説明
package_name package_name はパッケージに割り当てられた識別子であり、各パッケージにはスキーマ内で一意の名前が必要となります。
AUTHID DEFINER AUTHID 句を省略した場合、または AUTHID DEFINER を指定した場合には、パッケージ所有者の権限を使用してデータベースオブジェクトへのアクセス権限を決定し、パッケージ所有者の検索パスを使用して非修飾データベースオブジェクトの参照を解決します。
AUTHID CURRENT_USER AUTHID CURRENT_USER を指定した場合には、パッケージ内のプログラムを実行する現在のユーザーの権限を使用して、データベースオブジェクトへのアクセス権限を決定し、パッケージ内のプログラムを実行する現在のユーザーの検索パスを使用して、修飾されていないデータベースオブジェクトの参照を解決します。
declaration declaration はパブリック変数の識別子です。 パブリック変数は、package_name.variable 構文を使用して、パッケージの外部からアクセスすることができます。 0、1、またはそれを超えるパブリック変数が存在します。 パブリック変数の定義は、プロシージャまたは関数の宣言の前に置く必要があります。 declaration は次のタイプのいずれかになります。
  • 変数宣言
  • レコード宣言
  • コレクション宣言
  • REF CURSOR およびカーソル変数宣言
  • レコード、コレクション、および REF CURSOR の TYPE 定義
  • 例外
  • オブジェクト変数宣言
argname 引数の名前。 引数は、関数またはプロシージャ本体内でこの名前によって参照されます。
IN | IN OUT | OUT 引数モード。
  • IN は、入力専用の引数を宣言します。 これがデフォルト値です。
  • IN OUT を使用すると、引数が値を受け取ったり、値を返したりできます。
  • OUT は、引数が出力専用であることを指定します。
argtype

引数のデータ型。 引数の型は、基本データ型、%TYPE を使用する既存の列の型のコピー、またはネストされたテーブルやオブジェクト型などのユーザー定義型の場合があります。 基本型には長さを指定することはできません。例えば、VARCHAR2 (10) ではなく VARCHAR2 を指定します。

列のタイプは、tablename.columnname%TYPE と記述することによって参照されます。 tablename.columnname%TYPE を使用すると、プロシージャをテーブルの定義の変更から独立させるのに役立つ場合があります。

DEFAULT value DEFAULT 句は、呼び出しで指定されていない場合の、入力引数のデフォルト値を提供します。 IN OUT または OUT モードの引数には DEFAULT を指定することができません。
name name は、関数またはプロシージャの名前です。
restriction 次のキーワードは互換性を保つため使用できますが、無視されます。
  • RNDS
  • RNPS
  • TRUST
  • WNDS
  • WNPS

パッケージ本体の構文

パッケージ実装の詳細はパッケージ本体にあります。 パッケージ本体には、パッケージユーザーから見えないオブジェクトが含まれている場合があります。 Oracle 互換 PolarDB は、パッケージ本体について次の構文をサポートしています。
CREATE [ OR REPLACE ] PACKAGE BODY package_name
  { IS | AS }
  [ private_declaration; ] ...
  [ procedure_or_function_definition; ] ...
  [ package_initializer ]
END [ package_name ] ;
ここで procedure_or_function_definition :=
procedure_definition | function_definition
ここで procedure_definition :=
PROCEDURE proc_name [ argument_list ] [ options_list ] { IS | AS }

procedure_body END [ proc_name ] ;
				
ここで procedure_body :=
[ declaration; ] [, ... ] BEGIN

statement; [ ... ] [ EXCEPTION

{ WHEN exception [ OR exception ] [...] ] THEN statement; } [...]

]
				
ここで function_definition :=
FUNCTION func_name [ argument_list ] RETURN rettype [ DETERMINISTIC ] [ options_list ] { IS | AS }

function_body END [ func_name ] ;
				
ここで function_body :=
[ declaration; ] [, ... ] BEGIN

statement; [ ... ]

[ EXCEPTION

{ WHEN exception [ OR exception ] [ ... ] THEN statement; } [ ... ]

]
				
ここで argument_list :=
( argument_declaration [, ... ] )
ここで argument_declaration :=
argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
ここで options_list :=
option [ ... ]
ここで option :=
COST execution_cost ROWS result_rows

SET config_param { TO value | = value | FROM CURRENT } 
				
ここで package_initializer :=
BEGIN

statement; [... ] END;
				

パラメーター

パラメーター 説明
package_name package_name は、パッケージ本体の名前です。 この名前のパッケージ定義が存在することが前提です。
private_declaration private_declaration は、パッケージ内の任意のプロシージャまたは関数からアクセスできるプライベート変数の識別子です。 0、1、またはそれを超えるプライベート変数が存在します。private_declaration は、次のタイプのいずれかになります。
  • 変数宣言
  • レコード宣言
  • コレクション宣言
  • REF CURSOR およびカーソル変数宣言
  • レコード、コレクション、および REF CURSOR の TYPE 定義
  • 例外
  • オブジェクト変数宣言
proc_name 作成するプロシージャの名前。
declaration 変数、型、または REF CURSOR 宣言。
statement SPL プログラム文。 DECLARE - BEGIN - END ブロックは、それ自体がSPL 文と見なされることにご注意ください。 したがって、関数本体にはネストされたブロックが含まれる場合があります。
exception NO_DATA_FOUND や OTHERS などの例外条件名。
func_name 作成される関数の名前。
rettype 戻り値のデータ型は、argtype にリストされている任意の型です。 argtype については、rettype に長さを指定することはできません。
DETERMINISTIC DETERMINISTIC を組み込んで、同じ引数値が与えられたときに関数が常に同じ結果を返すように指定します。 DETERMINISTIC 関数はデータベースを更新することはできません。
DETERMINISTIC キーワードは、PostgreSQL の IMMUTABLE オプションと同等です。
declaration 変数、型、または REF CURSOR 宣言。
argname 仮引数の名前。 引数は、プロシージャ本体内でこの名前によって参照されます。
IN | IN OUT | OUT 引数モード。
  • IN は、入力専用の引数を宣言します。 これがデフォルト値です。
  • IN OUT を使用すると、引数が値を受け取ったり、値を返したりすることができます。
  • OUT は、引数が出力専用であることを指定します。
argtype

引数のデータ型。 引数の型は、基本データ型、%TYPE を使用する既存の列の型のコピー、またはネストされたテーブルやオブジェクト型などのユーザー定義型の場合があります。 基本タイプには長さを指定することはできません。例えば、VARCHAR2(10) ではなく VARCHAR2 を指定します。

列のタイプは、tablename.columnname%TYPE と記述することによって参照されます。 tablename.columnname%TYPE を使用すると、プロシージャをテーブルの定義の変更から独立させることができます。

DEFAULT value DEFAULT 句は、プロシージャ呼び出しで入力引数が提供されていない場合には、入力引数のデフォルト値を提供します。 IN OUT または OUT モードの引数には DEFAULT を指定することができません。
次のオプションは、Oracle データベースと互換性がありません。 これらは、Oracle 互換 PolarDB によってのみ提供される Oracle パッケージ構文の拡張機能です。
STRICT STRICT キーワードは、NULL 引数を指定して呼び出された場合は、関数が実行されないことを指定します。 代わりに、関数は NULL を返します。
LEAKPROOF LEAKPROOF キーワードは、関数が戻り値を介して以外に、引数に関する情報を公開しないことを指定します。
execution_cost execution_cost は、関数の推定実行コストを示す正の数を cpu_operator_cost の単位で指定します。 関数がセットを返す場合、これは返される行ごとのコストです。 デフォルト値:0.0025。
result_rows result_rows は、クエリプランナーが関数から返されると予想する行の推定数です。 デフォルト値:1000。
SET 関数の期間のパラメーター値を指定するには、SET 句を使用します。
  • config_param はパラメーター名を指定します。
  • value はパラメーター値を指定します。
  • FROM CURRENT は、関数の終了時にパラメーター値が復元されることを保証します。
package_initializer package_initializer の文は、パッケージが最初に参照されるときに、ユーザーのセッションごとに 1 回実行されます。
STRICT、LEAKPROOF、COST、ROWS、SET キーワードは、Oracle 互換 PolarDB に拡張機能を提供し、Oracle ではサポートされていません。