Oracle資料庫儲存過程和儲存函式

2021-06-13 15:28:23 字數 4301 閱讀 4452

指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存過程、儲存函式。

儲存過程沒有返回值。儲存函式有返回值

建立儲存過程

用create procedure命令建立儲存過程和儲存函式。

語法:

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

as plsql子程式體;

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

/*

為指定的職工在原工資的基礎上長10%的工資,並列印工資前和工資後的工資*/

sql> create or replace procedure raisesalary(empid in number)

aspsal 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;

1  /

procedure created

--儲存過程呼叫

--

方法一

sql> set serveroutput on

sql> exec raisesalary(7369);

員工號:7369漲工資前

800漲工資後880

方法二set serveroutput on

begin

raisesalary(7369);

end;

/

pl/sql procedure successfully completed

儲存函式

函式(function)為一命名的儲存程式,可帶引數,並返回一計算值。函式和過程的結構類似,但必須有乙個return子句,用於返回函式值。函式說明要指定函式名、結果值的型別,以及引數型別等。

建立儲存函式的語法:

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

return 函式值型別

as

plsql子程式體;

示例:查詢某職工的年收入。

sql> /**/

/* 查詢某職工的總收入

*/create or replace function queryempsalary(empid in number)

return number

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

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

begin

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

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

end;

/ function created

l函式的呼叫

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

觸發器

資料庫觸發器是乙個與表相關聯的、儲存的pl/sql程式。每當乙個特定的資料操作語句(insert,update,delete)在指定的表上發出時,oracle自動地執行觸發器中定義的語句序列。

觸發器的型別

語句級觸發器

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

行級觸發器(for each row)

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

建立觸發器

create  [or replace] trigger 觸發器名

on  表名

[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,'hh24'))not between 8 and 18 then

end if;

end;

/ trigger created

觸發語句與偽記錄變數的值

觸發語句

:old

:new

insert

所有欄位都是空(null)

將要插入的資料

update

更新以前該行的值

更新後的值

delete

刪除以前該行的值

所有欄位都是空(null)

示例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

end if;

end;

/ trigger created

執行後結果:

sql> update emp set sal=260 where empno=7499;

update emp set sal=260 where empno=7499

ora-20001:

更新後的薪水比更新前小

ora-06512:

在"scott.checksal", line 4

ora-04088:

觸發器'scott.checksal'

執行過程中出錯

觸發器總結

觸發器可用於 •

資料確認

•實施複雜的安全性檢查 •

做審計,跟蹤表上所做的資料操作等

查詢觸發器、過程及函式 •

select * from user_triggers; •

select * from user_source;

Oracle資料庫儲存過程和建立過程

oracle提供可以把pl sql程式儲存在資料庫中,並可以在任何地方來執行它。這樣就叫儲存過程或函式。儲存過程和函式統稱為pl sql子程式,它們是被命名的pl sql塊,均儲存在資料庫中,並通過輸入 輸出引數或輸入 輸出引數與其呼叫者交換資訊。儲存過程和函式的唯一區別是 函式有個返回值,而儲存過...

Oracle資料庫儲存過程

建立語句 create or replace procedure 儲存過程名 儲存過程名定義 包括儲存過程名和引數列表。引數名和引數型別。引數名不能重複,引數傳遞方式 in,out,in out in 表示輸入引數,按值傳遞方式。out 表示輸出引數,可以理解為按引用傳遞方式。可以作為儲存過程的輸出...

oracle資料庫 儲存過程

儲存過程 stored procedure 是一組為了完成特定功能的sql 語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。儲存過程是資料庫中的乙個重要物件,任何乙個設計良好的資料庫應用程式都應該用到儲存過程。儲存過程是由流控制和sql 語句...