SAK 図書館

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

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

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



Copyright (C) 1999-2017 Y.SAK