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