oracle存储过程与函数的区别及作用,Oracle存储过程与存储函数-入门
文章思維導圖
一. 存儲過程和存儲函數(shù)的定義
定義:存儲在數(shù)據(jù)庫中,供所有用戶程序調(diào)用的子程序叫做存儲過程/存儲函數(shù)。復雜點的解釋:存儲過程(Stored Procedure),就是一組用于完成特定數(shù)據(jù)庫功能的SQL 語句集,該SQL語句集經(jīng)過編譯后存儲在數(shù)據(jù)庫系統(tǒng)中。在使用時候,用戶通過指定已經(jīng)定義的存儲過程名字并給出相應的存儲過程參數(shù)來調(diào)用并執(zhí)行它,從而完成一個或一系列的數(shù)據(jù)庫操作。
區(qū)別:是否可以通過return返回函數(shù)值。
存儲函數(shù)可以通過return返回函數(shù)值;而存儲過程不可以。
注意:由于通過out參數(shù),存儲過程也可以返回函數(shù)值,所以存儲過程和存儲函數(shù)已經(jīng)沒有太大的區(qū)別了。而存儲函數(shù)仍然存在,是由于oracle不斷升級,需要實現(xiàn)向下兼容,所以存儲函數(shù)就一直存留著。
二. 存儲過程
1. 創(chuàng)建和使用存儲過程
用create procedure命令建立存儲過程,語法如下:
create [or replace] procedure 過程名(參數(shù)列表)
as -- as不可以省略
PLSQL子程序體;
注意事項:
1> 存儲過程或者存儲函數(shù),只能創(chuàng)建或者替換。
2> 參數(shù)可以帶也可以不帶。
3> as相當于PLSQL語句中的declare,用來聲明變量、游標等,但是不可以省略。
2. 入門案例:
(1)不帶參數(shù)的存儲過程:不用帶括號
create or replace procedure sayHello
as
begin
dbms_output.put_line('HelloWorld');
end;
/
調(diào)用方式:
<1> 使用execute:
exec是sqlplus命令,只能在sqlplus中使用,使用時,exec可以直接跟過程名(可以省略括號);
控制臺執(zhí)行示例:
SQL> set serveroutput on;
SQL> exec sayHello;
<2> 使用call:
使用call時,要帶上括號;call為SQL命令使用時,對場景沒有限制。
控制臺執(zhí)行示例:
SQL> set serveroutput on;
SQL> call sayHello();
<3> 使用PLSQL語句調(diào)用:
控制臺執(zhí)行示例:
SQL> set serveroutput on;
SQL> begin
sayHello;
end;
/
(2)帶參數(shù)的存儲過程:
給指定的員工漲100元工資,并且打印漲前和漲后的薪水:
create or replace procedure addSal(pempno in emp.empno%type)
as
pename emp.ename%type;
beforesal emp.sal%type;
aftersal emp.sal%type;
begin
select ename,sal into pename,beforesal from emp where empno=pempno;
aftersal:=beforesal+100;
update emp set sal=aftersal where empno=pempno;
dbms_output.put_line('姓名: '||pename||' 漲前工資:'||beforesal||'漲后工資:'||aftersal);
end;
/
執(zhí)行代碼截圖
** 注意事項:**
<1> 要說明,參數(shù)是輸入?yún)?shù)(in)還是輸出參數(shù)(out);
<2> 為保證調(diào)用多個存儲過程中處在同一個事務中,所以一般不在存儲過程或者存儲函數(shù)中,commit或rollback;
3. 調(diào)試存儲過程:
SQL Developer 調(diào)試存儲過程
** 注意事項:**
(1) oracle數(shù)據(jù)庫和PLSQL工具都是放在同一個機器上;
(2) 在開啟調(diào)試時,可能會報出權(quán)限不夠的錯誤信息,通過下面方式進行授權(quán):
授權(quán)
三. 存儲函數(shù)
1. 存儲函數(shù):
函數(shù)(Function)為一命名的存儲程序,可帶參數(shù),并返回一計算值.
函數(shù)和過程的結(jié)構(gòu)類似,但必須有一個return子句,用于返回函數(shù)值.
2. 創(chuàng)建存儲函數(shù)的語法:
create [or replace] function 函數(shù)名(參數(shù)列表)
return 函數(shù)值類型
as
PLSQL子程序體;
注意事項:
(1) 與存儲過程注意事項類似,不同的是,必須有個返回值;
(2) 參數(shù)列表可以有,也可以沒有.當沒有時,函數(shù)名后面不要帶括號.
create or replace function queryempannal(pempno in number)
return number
as
psal emp.sal%type;
pcomm emp.comm%type;
begin
select sal,comm into psal,pcomm from emp where empno=pempno;
return psal*12+nvl(pcomm,0);
end;
四. in和out參數(shù)
1.概述
(1) 一般來講,存儲過程和存儲函數(shù)的區(qū)別在于存儲函數(shù)可以有一個返回值;而存儲過程沒有返回值.
(2) 過程和函數(shù)都可以通過out指定一個或多個輸出參數(shù).我們可以利用out參數(shù),在過程和函數(shù)中實現(xiàn)返回多個值.
a. 存儲過程和存儲函數(shù)都可以有out參數(shù);
b. 存儲過程和存儲函數(shù)都可以有多個out參數(shù);
c. 存儲過程可以通過out參數(shù)來實現(xiàn)返回值;
(3) 什么時候用存儲過程/存儲函數(shù)?
原則:如果只有一個返回值,用存儲函數(shù);否則,就用存儲過程.
create or replace procedure queryempinform(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2 )
as
begin
select ename,sal,job into pename,psal,pjob from emp where empno=eno;
end;
/
總結(jié)
以上是生活随笔為你收集整理的oracle存储过程与函数的区别及作用,Oracle存储过程与存储函数-入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php怎么把字符转成大写,php怎么把字
- 下一篇: oracle目录删除后恢复,Oracle