Oracleでは、データベース格納プロセスと記憶関数の使用について
記憶プロセスと記憶関数とは、すべてのユーザプログラムのためにデータベースに格納されたサブルーチンを記憶プロセス、記憶関数といいます。格納プロセスは値を返しませんでした。記憶関数には戻り値があります。 ストレージの作成 CREATE PROCEUREコマンドで記憶プロセスと記憶関数を作成します。 文法:create[or replace]PROCEUREプロセス名(パラメータリスト)AS PLSQLサブルーチン; 保存プロセス例:指定された従業員のための元の給料に基づいて10%の賃金を支払う。 /*指定された従業員のために、元の給料の10%の給料をもとにして、そして給料前と給料後の給料を印刷します。*/SQL>create or replace procedure raseSalary(emped in number) as pSal emp.sal%type;--従業員の現在の給料を保存します。 Begin--その従業員の給料を調べます。 select sal into psal from emphere empno=emppid;その社員に給料を上げる。 udate emp set sal=sal*1.1 where empno=emppid;--賃上げ前後の賃金を印刷する dbms_out put.put_LINE('社員番号:'𞓜𞓜epid𞓜𞓜';𞓜';が給料を上げる前に ' || pspal𞓜𞓜が給料を上げた後、𞓜pspal*1.1) end; 1 /Procedure created--格納プロセス呼び出し--方法一SQL>serverout put onSQL>exec rasesalary(7369)従業員番号:7369給料を上げる前に800元の給料を上げた後に880方法の2 set serverout put onbegin rasesalary(7369)end/PL/SQL procedure success fully completted 記憶関数 関数(Function)は、名前付きの記憶プログラムです。パラメータを持って計算値を返します。関数とプロセスの構造は似ていますが、関数値を返すためにRETURNのサブフレーズが必要です。関数は、関数名、結果値の種類、パラメータタイプなどを指定します。 ストレージ関数のシンタックスを確立します。CREATE[OR REPLACE]FNCTION関数名(パラメータリスト)RETURN関数値タイプASPLSQLサブルーチン。 例:ある従業員の年収を調べる。SQL>/**// /* 従業員の総収入を調べる */ create or replace function queryEmpSalary(emppid in number) return number as pSal number;--変数を定義して従業員の給料を保存します。 pComm number;--変数保存従業員のボーナスを定義します。 begin select sal,comm into psp,pcompm from emphere empno=emppid; return pspal*12+nvl(pcomp,0) end; /Function created l 関数の呼び出しSQL>declare v_。sal number begin v_。sal:=queryEmpSalary(7934) dbms_out put.put_line('salary is)'𞓜v_sal); end; /salary is:15600 PL/SQL procedure success fully compleeted SQL>begin dbms_out put.put_line('salary is:''124 queryEmpSalary(7934); end; /salary is:15600 PL/SQL procedure succefully completted トリガー データベースフリップフロップは表に関連して記憶されているPL/SQLプログラムです。Oracleは、特定のデータ操作文(Insert,udate,delete)が指定された表に発行される毎に、フリップフロップで定義されたステートメントシーケンスを自動的に実行する。 トリガーの種類 ステートメントレベルトリガー 指定された操作語句の操作の前または後に一度実行します。この文がどれだけの行に影響を与えたかに関わらず。 行レベルトリガー(FOR EACH ROW) トリガーステートメント機能の各レコードがトリガされます。行レベルトリガーでは、oldとnewダミー記録変数を使用して、値の状態を識別します。 トリガーCREATEを作成 [TRIGGERトリガー名 {BEFOREE AFTER {DELETE_INSERT_UDATE[OF列名] オン 表の名前 [FOR EACH ROW[WHEN(条件)] PLSQLブロック 例1:非稼働時間を制限してデータベースにデータSQLを挿入する>create or replace trigger securityEmp before insert on emp declare begin if to_char(sysdate,'day')in('木曜日','土曜日','日曜日') or to_number(to_char(sysdate、'hh 24')not between 8 and 18 then レイセ.appication_error(-20001、'非稼働時間にデータを挿入することはできません。') end if; end; /Trigger createdトリガ文と疑似記録変数の値
トリガ文
:old
:new
インセンス
すべてのフィールドが空です。
挿入するデータを
Update
以前の行の値を更新します。
更新後の値
delete
以前の行の値を削除します。
すべてのフィールドが空です。
例2:確認データ(チェックempテーブルのsalの修正値が元の値より低くない)SQL>create or replace trigger chockSal before udate of sal on emp for each row declare begin if:new.sal<:old.sal then レイセ.appication_error(-20001、'更新後の給与は更新前より小さい') end if; end; /Trigger created運転後の結果:SQL>udate emp set sal=260 where empno=7499;udate emp set sal=260 where empno=7499 ORA-20001:更新後の給与は更新前よりORA-0512:「SCOTT.CHECKSAL」、ライン4 ORA-0488:触発器'SCOTT.CHECKSAL'の実行中にエラーが発生しました。 トリガーまとめ トリガーは使用可能です。 データ確認・ 複雑な安全性検査・ 監査、追跡表に作成されたデータ操作などを行います。 トリガー、プロセス、関数を調べます。 Select*from user_triggers; Select*from user_source;
トリガ文
:old
:new
インセンス
すべてのフィールドが空です。
挿入するデータを
Update
以前の行の値を更新します。
更新後の値
delete
以前の行の値を削除します。
すべてのフィールドが空です。
例2:確認データ(チェックempテーブルのsalの修正値が元の値より低くない)SQL>create or replace trigger chockSal before udate of sal on emp for each row declare begin if:new.sal<:old.sal then レイセ.appication_error(-20001、'更新後の給与は更新前より小さい') end if; end; /Trigger created運転後の結果:SQL>udate emp set sal=260 where empno=7499;udate emp set sal=260 where empno=7499 ORA-20001:更新後の給与は更新前よりORA-0512:「SCOTT.CHECKSAL」、ライン4 ORA-0488:触発器'SCOTT.CHECKSAL'の実行中にエラーが発生しました。 トリガーまとめ トリガーは使用可能です。 データ確認・ 複雑な安全性検査・ 監査、追跡表に作成されたデータ操作などを行います。 トリガー、プロセス、関数を調べます。 Select*from user_triggers; Select*from user_source;