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 編資料