SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2025 Y.SAK