oracle存儲過程和存儲函數sql
指存儲在數據庫中供全部用戶程序調用的子程序叫存儲過程,存儲函數數據庫
存儲過程和存儲函數的相同點:完成特定功能的程序安全
存儲過程和存儲函數的區別:是否用return語句返回值oracle
=========================建立和使用存儲過程=============================app
用create procedure命令創建存儲過程和存儲函數分佈式
語法:函數
create [or replace] procedure 過程名(參數列表)spa
asorm
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程序
②沒當一個特定的數據操做語句(insert,update,delete)在指定的表上發出時,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;
/