oracle儲存過程和觸發器

zengzhaowu313發表於2019-01-06

學習分享必看:javacto.taobao.com

Oracle的Scott使用者

1、儲存過程示例:為指定的職工在原工資的基礎上長10%的工資

SQL> create or replace procedure raiseSalary(empid in number)

    as

    pSal emp.sal%type;

    begin

    select sal into pSal from emp where empno=empid;

    update emp set sal = sal*1.1 where empno=empid;

    dbms_output.put_line('員工號:' || empid || '漲工資前

    ' || psal || '漲工資後' || psal*1.1);

    end;

   /

 

Procedure created

 

SQL> set serveroutput on

SQL> exec raisesalary(7369);

 

員工號:7369漲工資前

800漲工資後880

 

PL/SQL procedure successfully completed

2、儲存函式示例:查詢某職工的年收入。

SQL> /**/

    /* 

    查詢某職工的總收入

    */

    create or replace function queryEmpSalary(empid in number)

    return number

    as

    pSal number; --定義變數儲存員工的工資

    pComm number; --定義變數儲存員工的獎金

   begin

   select sal,comm into psal,pcomm from emp where empno = empid;

   return psal*12+nvl(pcomm,0);

   end;

   /

 

Function created

 

SQL> declare

    v_sal number;

    begin

    v_sal:=queryEmpSalary(7934);

    dbms_output.put_line('salary is:'|| v_sal);

    end;

    /

 

salary is:15600

 

PL/SQL procedure successfully completed

 

SQL> begin

    dbms_output.put_line('salary is:'|| queryEmpSalary(7934));

    end;

    /

 

salary is:15600

 

PL/SQL procedure successfully completed

3、建立觸發器示例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,'hh24'))not between 8 and 18 then 

    raise_application_error(-20001,'不能在非工作時間插入資料。');

    end if;

   end;

   /

 

Trigger created

4、建立觸發器示例2:確認資料(檢查emp表中sal 的修改值不低於原值)

SQL> create or replace trigger checkSal

    before update of sal on emp

    for each row

    declare

    begin

    if :new.sal<:old.sal then

    raise_application_error(-20001,'更新後的薪水比更新前小');

    end if;

    end;

   /

 

Trigger created

相關文章