SAK 図書館
Oracle PL/SQL 編6 - ストアドパッケージ package 、データベーストリガー
■ストアドパッケージ
・パッケージとは、ストアドファンクション、ストアドプロシジャを共有宣言
も含めひとつにまとめたものである。
パッケージを使用すると、関連ストアドファンクションのロード効率向上と
プロトタイプ宣言によるコンパイルが可能になる。
また、サブプログラム名のオーバーロードを使用して、異なる引数タイプ等
の関数を作成できる。
・実際のパッケージ使用例は、次の資料を参照下さい。
Oracle PL/SQL 編17 - テーブル構造取得ストアド、CreatePLSQLDynaset、ASP
・サブプログラムのオーバーロードは、次の資料を参照下さい。
Oracle PL/SQL 編18 - パッケージサブプログムオーバーロード、package
・パッケージは、仕様部と本体部で構成される。
まず、次のようにパッケージ仕様部を作成する。
/*
========================================================================
テストパッケージ仕様
========================================================================
*/
create or replace package test is
function Test1(p1 in varchar2, p2 in varchar2) return varchar2;
procedure Test2(p1 in varchar2, p2 in out varchar2);
procedure Test3(p1 in varchar2);
end;
/
・パッケージの中にストアドファンクションを追加するのは、次のようにする。
尚、プロトタイプ宣言文と同じ関数がないとコンパイルエラーが返ってくる。
仕方ないので、作成途中の関数はダミーを記述しておくと良いでしょう。
/*
========================================================================
テストパッケージ本体
========================================================================
*/
create or replace package body test is
/*
======================================================================
テスト1 ファンクション
======================================================================
*/
function Test1(p1 in varchar2, p2 in varchar2) return varchar2 is
begin
dbms_output.put_line('para1 = ' || p1);
dbms_output.put_line('para1 = ' || p2);
return p1 || p2;
end;
/*
======================================================================
テスト2 プロシジャ
======================================================================
*/
procedure Test2(p1 in varchar2, p2 in out varchar2) is
begin
dbms_output.put_line('para1 = ' || p1);
dbms_output.put_line('para1 = ' || p2);
p2 := p1 || p2;
end;
/*
======================================================================
テスト3 プロシジャ
======================================================================
*/
procedure Test3(p1 in varchar2) is
begin
null;
end;
end;
/
・実際のストアドファンクションの呼び出しは、次のようにパッケージ名で修
飾します。
-- Test1 テスト
set serveroutput on;
variable rcd varchar2(200);
execute :rcd := test.test1('aaa', 'bbb');
print rcd;
-- Test2 テスト
set serveroutput on;
variable p2 varchar2(200);
execute :p2 := 'def';
execute test.test2('aaa', :p2);
print p2;
・パッケージ、BODY の情報は次の問い合わせで得られます。
select * from user_objects where object_type = 'PACKAGE BODY';
select * from user_source where type = 'PACKAGE BODY';
・BODY、パッケージの削除は、次のようにします。
drop package body test;
drop package test;
■データベーストリガー
・文トリガーはあまり利用することがないと思うので、行トリガーについて説
明する。実行のタイミングは before、after から選べる。
:new、:old は、新と旧のデータを示す。
いつも思うのだが、Oracle の elseif は、なんで elsif なんだろ。
毎度、記述を間違えてコンパイルエラーを出してしまう。(^^;
create or replace trigger test
before insert or update or delete on 受注m for each row
begin
if inserting then
insert into 受注sv values(:new.受注番号, :new.品番, :new.受注数);
elsif updating then
update 受注sv set 品番 = :new.品番, 受注数 = :new.受注数
where 受注番号 = :old.受注番号;
else
delete from 受注sv where 受注番号 = :old.受注番号;
end if;
end;
/
・トリガーの情報は次の問い合わせで得られます。
select * from user_objects where object_type = 'TRIGGER';
・トリガー停止、再開は、次のようにする。(トリガー起動)
alter trigger test disable;
alter trigger test enable;
・トリガーの削除は、次のようにする。
drop trigger test;
■Oracle PL/SQL 編資料
■SQL 基礎実地編資料
■SQL 基礎編資料
■SQL チューニング編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料