サーチ…
構文
CREATE [OR REPLACE]パッケージpackage_name
[AUTHID {CURRENT_USER | DEFINER}]
{IS |として}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[例外の宣言...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_spec ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
[PRAGMA RESTRICT_REFERENCES(アサーション)...]
END [パッケージ名];
パッケージの作成または置換PackageName IS
ファンクションFunctionName(parameter1 IN VARCHAR2、paramter2 IN NUMBER)RETURN VARCHAR2;
END PackageName;
CREATE [OR REPLACE]パッケージ本体package_name
{IS |として}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[例外の宣言...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_body ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
END [パッケージ名];
Package BODY PackageName ISを作成または置換します。
ファンクションFunctionName(parameter1 IN VARCHAR2、paramter2 IN NUMBER)RETURN VARCHAR2 IS
宣言
ベギン
実行するステートメント
RETURN varchar2変数
END FunctionName;
END PackageName;
パッケージの使用
PLSQLのパッケージは、プロシージャ、関数、変数、例外、定数、およびデータ構造の集合です。一般に、パッケージ内のリソースは互いに関連しており、同様のタスクを実行します。
パッケージを使う理由
- モジュール性
- パフォーマンス/意欲の向上
パッケージの一部
仕様 - パッケージヘッダーと呼ばれることもあります。変数と型の宣言と、パッケージ内にある関数とプロシージャのシグネチャを含みます。これらはパッケージの外部から呼び出されるpublicです。
パッケージ本体 - コードとプライベート宣言が含まれます。
パッケージ仕様は、パッケージ本体の前にコンパイルする必要があります。そうしないと、パッケージ本体のコンパイルによってエラーが報告されます。
オーバーロード
パッケージ内の関数とプロシージャは、オーバーロードすることができます。次のパッケージTESTには、 print_numberという2つのプロシージャがあります。これらのプロシージャは、呼び出されるパラメータによって異なる動作をします。
create or replace package TEST is
procedure print_number(p_number in integer);
procedure print_number(p_number in varchar2);
end TEST;
/
create or replace package body TEST is
procedure print_number(p_number in integer) is
begin
dbms_output.put_line('Digit: ' || p_number);
end;
procedure print_number(p_number in varchar2) is
begin
dbms_output.put_line('String: ' || p_number);
end;
end TEST;
/
我々は両方の手順を呼ぶ。 1番目は整数パラメータ、2番目はvarchar2です。
set serveroutput on;
-- call the first procedure
exec test.print_number(3);
-- call the second procedure
exec test.print_number('three');
上記のスクリプトの出力は次のとおりです。
SQL>
Digit: 3
PL/SQL procedure successfully completed
String: three
PL/SQL procedure successfully completed
オーバーロードの制限
ローカルまたはパッケージされたサブプログラムまたは型メソッドのみがオーバーロードされます。したがって、スタンドアロンのサブプログラムを多重定義することはできません。また、仮パラメータが名前またはパラメータ・モードでのみ異なる場合は、2つの副プログラムをオーバーロードできません
関数でパッケージヘッダとボディを定義します。
この例では、パッケージヘッダーとパッケージ本体を関数として定義します。
その後、戻り値を返す関数をパッケージから呼び出しています。
パッケージヘッダー :
CREATE OR REPLACE PACKAGE SkyPkg AS
FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
RETURN VARCHAR2;
END;
/
パッケージ本体 :
CREATE OR REPLACE PACKAGE BODY SkyPkg AS
FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
RETURN VARCHAR2
AS
vColour VARCHAR2(100) := NULL;
BEGIN
IF vPlanet = 'Earth' THEN
vColour := 'Blue';
ELSIF vPlanet = 'Mars' THEN
vColour := 'Red';
END IF;
RETURN vColour;
END;
END;
/
パッケージ本体から関数を呼び出す :
DECLARE
vColour VARCHAR2(100);
BEGIN
vColour := SkyPkg.GetSkyColour(vPlanet => 'Earth');
DBMS_OUTPUT.PUT_LINE(vColour);
END;
/