1. 程式人生 > >oracle存儲過程和存儲函數&觸發器

oracle存儲過程和存儲函數&觸發器

員工 觸發器的類型 table 序列 ger set 備份 oracl return

oracle存儲過程和存儲函數

指存儲在數據庫中供所有用戶程序調用的子程序叫存儲過程,存儲函數

存儲過程和存儲函數的相同點:完成特定功能的程序

存儲過程和存儲函數的區別:是否用return語句返回值

=========================創建和使用存儲過程=============================

create procedure命令建立存儲過程和存儲函數

語法:

create [or replace] procedure 過程名(參數列表)

as

PLSQL子程序體;

實例:帶參數的存儲函數

create or replace procedure RaiseSalry(eno in number)

as

psal emp.sal%type;

begin

select sal into psal from emp where EMPNO=eno;

update emp set sal = sal +100 where EMPNO=eno;

DBMS_OUTPUT.PUT_LINE(‘漲工資前的薪水‘||psal||‘漲工資後的薪水‘||(psal+100));

end;

/

===========================創建存儲函數的語法============================

create [or replace] function 函數名(參數列表)

return 函數值類型

as

plsql子程序體;

實例:查詢某個員工的年收入

create or replace function queryempincome(eno in number)

return number

as

--定義變量保存員工薪水和獎金

psal emp.sal%type;

pcomm emp.comm%type;

begin

--得到員工的月薪和獎金

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

--直接返回年收入

return psal*12+pcomm;

end;

/

===========================in

out參數=============================

過程和函數可以通過out指定一個或多個輸出參數,我們可以利用out參數,在過程和函數中實現多個返回值

原則:如果只有一個返回值,就用存儲函數,否則,就用存儲過程


實例:out參數,查詢員工姓名,月薪和職位

create or replace procedure queryempinform(eno in number,

pname out varchar2,

psal out number,

pjob out varchar2)

as

begin

--得到該員工的姓名,月薪和職位

select ename,sal,ejob into pname,psal,pjob from emp where empno=eno;

end;

/

==========================out參數中使用光標=========================

案例:查詢某個部門中所有員工的所有信息

--包頭:聲明

create or replace package mypackage as

type empcursor is ref cursor;

procedure queryEmpList(dno in number,empList out empcursor);

end mypackage;

--包體:實現包頭聲明的所有方法

create or replace package body mypackage as

procedure queryEmpList(dno in number,empList out empcursor)

as

begin

open empList for select * from emp where deptno=dno;

end queryEmpList;

end mypackage;

oracle觸發器

========================什麽是觸發器(trigger==========================

①數據庫觸發器是一個與表相關聯的,存儲的pl/sql程序

②沒當一個特定的數據操作語句(insertupdatedelete)在指定的表上發出時,oracle自動的執行觸發器中定義的語句序列

如何創建觸發器

create trigger saynewemp

after insert

on emp

declare

begin

dbms_output.put_line(‘成功插入新員工‘);

end;

/

============================觸發器應用場景==============================

1.復雜的安全性檢查

2.數據確認

3.實現審計功能

4.完成數據的備份和同步

==============================觸發器的語法==============================

創建觸發器的語法

create [or replace] trigger 觸發器名

{before|after}

{delete|insert|update[of 列名]}

on 表名

[for each row [when(條件)]]

plsql

==============================觸發器的類型==============================

語句級觸發器:在指定的操作語句之前或之後執行一次,不管這條語句影響了多少行

行級觸發器:觸發語句作用的每一條記錄都被觸發。在行級觸發器中使用:old:new偽記錄變量,識別值得狀態

=================================案例=================================

觸發器應用場景一:實施復雜的安全性檢查

禁止在非工作時間插入新員工

1,周末:to_char(sysdate,‘day‘)in(‘星期六‘,‘星期日‘)

2,上班前,下班後:to_number(to_char(sysdate,‘hh24‘)) not between 9 and 18

create or replace trigger securityemp

before insert

on emp

begin

if to_char(sysdate,‘day‘)in(‘星期六‘,‘星期日‘) or

to_number(to_char(sysdate,‘hh24‘)) not between 9 and 18 then

--禁止insert新員工

raise_application_error(-20001,‘禁止在非工作時間插入新員工‘);

end if;

end;

/

觸發器應用場景數據的確認

漲工資不能越漲越少

create or replace trigger checksalary

before update

on emp

for each row

begin

if :new.sal<:old.sal then

raise_application_error(-20002,‘漲後的薪水不能少於漲前的薪水,漲後的薪水:‘||:new.sal||‘漲前的薪水‘||:old.sal);

end if;

end;

/
觸發器應用場景數據庫審計

創建基於值的觸發器

給員工漲工資,當漲後的薪水超過6000,審計該員工的信息

創建表用於保存審計信息

create table audit_info

(

information varchar2(200)

);

create or replace trigger do_audit_emp_salary

after update

on emp

for each row

begin

--當漲後的薪水大於5000,插入審計信息

if :new.sal>5000 then

insert into audit_info values(:new.empno||‘ ‘||new.ename||‘

‘||:new.sal);

end if;

end;

/

觸發器應用場景數據的備份和同步

利用觸發器實現數據的同步部分(分布式數據庫)

當給員工漲工資後自動備份到備份表中

create or replace trigger sync_salary

after update

on emp

for each row

begin

--當主表更新後,自動更新備份表

update emp_back set sal=:new.sal where empno=:new.empno;

end;

/



oracle存儲過程和存儲函數&觸發器