PL SQLプログラミングの本をいくつか読んだことがありますが、プロシージャ、関数、カーソルなどをパッケージにグループ化することをお勧めします。パッケージは、オブジェクト指向設計であるモジュール性と情報隠蔽を提供します。ただし、私はスタンドアロンの手順に精通しています。誰かが親切にコードのいくつかの例とクライアントからパッケージを呼び出す方法を提供しますか?現在、クライアントアプリケーションのデータアクセスとしてODP.NETを使用しています。ありがとうございました。
4 に答える
スタンドアロンプロシージャの呼び出しに精通している場合は、パッケージ内のプロシージャの呼び出しに大きな違いはありません。package_name.procedure_nameのように、プロシージャ名の前にパッケージ名を付けるだけです。
プロシージャ、関数などのコードを、プライベート変数の宣言とともにパッケージ本体に配置します。これらのプロシージャと関数の宣言、およびパブリック変数をパッケージに入れます。後者のみがパッケージの外部からアクセス可能であり、そのためには、名前の前にパッケージ名とドットを付ける必要があります。
このパッケージのデータ構造タイプも定義できます。パブリックプロシージャがそれらを入力または出力として使用する場合は、パブリックにする必要があります。そうでない場合は、自由に選択できます。
サンプルコード、メモリからのものであり、テストされていないため、バグがある可能性があります。
create or replace package foo as
a number;
function test1(s1 in varchar2) return varchar2;
procedure test2(i1 in integer);
end;
/
create or replace package body foo as
b number; -- internal only
function internalfunc(s in varchar2) return varchar2;
function test1(s1 in varchar2) return varchar2 is
s varchar2(32000);
-- variables ...
begin
-- code ...
return internalfunc(s);
end;
procedure test2(i1 in integer) is
-- variables ...
begin
-- code ...
end;
function internalfunc(s in varchar2) return varchar2 is
begin
return INITCAP(LOWER(s));
end;
end;
/
これらの関数と変数を使用するには、などを使用しますfoo.a
。foo.test1
パッケージの外部から内部機能にアクセスすることはできません。それらが実装よりも上位に呼び出されている場合にのみ、パッケージ本体の早い段階で宣言する必要があります。
パッケージには、プレーンな関数やプロシージャよりも優れた利点があります。名前をオーバーロードしたり、同じ名前で同じパッケージに異なるパラメータタイプを使用したりすることができ、使用するパラメータタイプに応じて適切な関数が呼び出されます。対照的に、スタンドアロン関数またはプロシージャの名前は一意である必要があります。
HTH。
グローバルスコープで関数を宣言するだけでなく、パッケージを使用することをお勧めします。
パッケージがある場合、後で同じコンテキストで関数を追加したい場合に拡張性を提供できます。また、どのライブラリ(パッケージ)から呼び出された関数であるかが示されるため、プロシージャが読みやすくなります。
フォローアップするために、次のようなスタンドアロンがあるかもしれません
create or replace procedure foo (i_something in varchar2) as
begin
-- do some stuff;
end foo;
「foo('bar');」で呼び出します
それはパッケージとパッケージ本体になります
create or replace package my_package as
procedure foo (i_something in varchar2);
end;
create or replace package body my_package as
procedure foo (i_something in varchar2);
begin
-- do some stuff;
end foo;
end my_package;
「my_package.foo('bar');」で呼び出します
単一の手順の場合、パッケージを使用してもあまり明確にならない場合があります。しかし、多くの関数と手順を扱っている場合は、はるかにクリーンです。