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