指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存過程、儲存函式。
儲存過程沒有返回值。儲存函式有返回值
建立儲存過程
用create procedure命令建立儲存過程和儲存函式。
語法:
create [or replace] procedure過程名(引數列表)儲存過程示例:為指定的職工在原工資的基礎上長10%的工資as plsql子程式體;
/*為指定的職工在原工資的基礎上長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 replacetrigger 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 checksalbefore 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 語句...