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