Oracle中 關(guān)于數(shù)據(jù)庫存儲(chǔ)過程和存儲(chǔ)函數(shù)的使用
存儲(chǔ)過程沒有返回值。存儲(chǔ)函數(shù)有返回值
創(chuàng)建存儲(chǔ)過程
用CREATE PROCEDURE命令建立存儲(chǔ)過程和存儲(chǔ)函數(shù)。
語法:
create [or replace] PROCEDURE過程名(參數(shù)列表)
AS
PLSQL子程序體;
存儲(chǔ)過程示例:為指定的職工在原工資的基礎(chǔ)上長(zhǎng)10%的工資
/*
為指定的職工在原工資的基礎(chǔ)上長(zhǎng)10%的工資,并打印工資前和工資后的工資
*/
SQL> create or replace procedure raiseSalary(empid in number)
as
pSal emp.sal%type;--保存員工當(dāng)前 工資
begin
--查詢?cè)搯T工的工資
select sal into pSal from emp where empno=empid;
--給該員工漲工資
update emp set sal = sal*1.1 where empno=empid;
--打印漲工資前后的工資
dbms_output.put_line('員工號(hào):' || empid || '漲工資前
' || psal || '漲工資后' || psal*1.1);
end;
1 /
Procedure created
--存儲(chǔ)過程調(diào)用
--方法一
SQL> set serveroutput on
SQL> exec raisesalary(7369);
員工號(hào):7369漲工資前
800漲工資后880
方法二
set serveroutput on
begin
raisesalary(7369);
end;
/
PL/SQL procedure successfully completed
存儲(chǔ)函數(shù)
函數(shù)(Function)為一命名的存儲(chǔ)程序,可帶參數(shù),并返回一計(jì)算值。函數(shù)和過程的結(jié)構(gòu)類似,但必須有一個(gè)RETURN子句,用于返回函數(shù)值。函數(shù)說明要指定函數(shù)名、結(jié)果值的類型,以及參數(shù)類型等。
建立存儲(chǔ)函數(shù)的語法:
CREATE [OR REPLACE] FUNCTION函數(shù)名(參數(shù)列表)
RETURN 函數(shù)值類型
AS
PLSQL子程序體;
示例:查詢某職工的年收入。
SQL> /**/
/*
查詢某職工的總收入
*/
create or replace function queryEmpSalary(empid in number)
return number
as
pSal number; --定義變量保存員工的工資
pComm number; --定義變量保存員工的獎(jiǎng)金
begin
select sal,comm into psal,pcomm from emp where empno = empid;
return psal*12+nvl(pcomm,0);
end;
/
Function created
l 函數(shù)的調(diào)用
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
觸發(fā)器
數(shù)據(jù)庫觸發(fā)器是一個(gè)與表相關(guān)聯(lián)的、存儲(chǔ)的PL/SQL程序。每當(dāng)一個(gè)特定的數(shù)據(jù)操作語句(Insert,update,delete)在指定的表上發(fā)出時(shí),Oracle自動(dòng)地執(zhí)行觸發(fā)器中定義的語句序列。
觸發(fā)器的類型
語句級(jí)觸發(fā)器
在指定的操作語句操作之前或之后執(zhí)行一次,不管這條語句影響了多少行。
行級(jí)觸發(fā)器(FOR EACH ROW)
觸發(fā)語句作用的每一條記錄都被觸發(fā)。在行級(jí)觸發(fā)器中使用old和new偽記錄變量,識(shí)別值的狀態(tài)。
創(chuàng)建觸發(fā)器
CREATE [or REPLACE] TRIGGER 觸發(fā)器名
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE [OF列名]}
ON 表名
[FOR EACH ROW [WHEN(條件) ] ]
PLSQL 塊
示例1:限制非工作時(shí)間向數(shù)據(jù)庫插入數(shù)據(jù)
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,'不能在非工作時(shí)間插入數(shù)據(jù)。');
end if;
end;
/
Trigger created
觸發(fā)語句與偽記錄變量的值
|
觸發(fā)語句 |
:old |
:new |
|
Insert |
所有字段都是空(null) |
將要插入的數(shù)據(jù) |
|
Update |
更新以前該行的值 |
更新后的值 |
|
delete |
刪除以前該行的值 |
所有字段都是空(null) |
示例2:確認(rèn)數(shù)據(jù)(檢查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
運(yùn)行后結(jié)果:
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: 觸發(fā)器 'SCOTT.CHECKSAL'執(zhí)行過程中出錯(cuò)
觸發(fā)器總結(jié)
觸發(fā)器可用于
• 數(shù)據(jù)確認(rèn)
• 實(shí)施復(fù)雜的安全性檢查
• 做審計(jì),跟蹤表上所做的數(shù)據(jù)操作等
查詢觸發(fā)器、過程及函數(shù)
• Select * from user_triggers;
• Select * from user_source;
相關(guān)文章
基于Oracle的面向?qū)ο蠹夹g(shù)入門基礎(chǔ)簡(jiǎn)析開發(fā)者網(wǎng)絡(luò)Oracle
基于Oracle的面向?qū)ο蠹夹g(shù)入門基礎(chǔ)簡(jiǎn)析開發(fā)者網(wǎng)絡(luò)Oracle...2007-03-03
Oracle如何清除一個(gè)用戶下的所有表(謹(jǐn)慎操作!)
在測(cè)試數(shù)據(jù)庫腳本可用性的時(shí)候,會(huì)新建一個(gè)用戶然后執(zhí)行腳本,測(cè)試成功之后,需要清空表,下面這篇文章主要給大家介紹了關(guān)于Oracle如何清除一個(gè)用戶下的所有表的相關(guān)資料,需要的朋友可以參考下2023-03-03
登錄oracle數(shù)據(jù)庫時(shí)密碼忘記的解決方法
登錄本地oracle數(shù)據(jù)庫時(shí),忘記密碼了,這種情況時(shí)有發(fā)生,下面有個(gè)不錯(cuò)的解決方法,希望對(duì)大家有所幫助2014-01-01
OB Oracle系統(tǒng)視圖權(quán)限導(dǎo)致的故障解決案例
在 Oracle 和 OB Oracle 租戶下調(diào)用存儲(chǔ)過程時(shí),兩者表現(xiàn)并不一致,導(dǎo)致獲取到的 SQL 文本拼接不完整,影響到了業(yè)務(wù)側(cè)的功能測(cè)試,本文將針對(duì)這個(gè)問題進(jìn)行相關(guān)的測(cè)試和驗(yàn)證2023-10-10
判定一個(gè)字符串是否為有效時(shí)間的函數(shù)
判定時(shí)間是否有效的函數(shù),為有效時(shí)間則返回1,不是有效時(shí)間則返回0,需要的朋友可以參考下2014-07-07
深入Oracle的left join中on和where的區(qū)別詳解
本篇文章是對(duì)Oracle的left join中on和where的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

