存储过程和函数的区别
存儲過程和函數(shù)目的是為了 可重復地 執(zhí)行操作數(shù)據(jù)庫的sql語句的集合。
區(qū)別是寫法和調(diào)用上。
寫法上:存儲過程的參數(shù)列表可以有輸入?yún)?shù)、輸出參數(shù)、可輸入輸出的參數(shù);
??????????? 函數(shù)的參數(shù)列表只有輸入?yún)?shù),并且有return <返回值類型,無長度說明>。
返回值上:
存儲過程的返回值,可以有多個值,
?????????? 函數(shù)的返回值,只有一個值。
調(diào)用方式上:
存儲過程的調(diào)用方式有:
1)、exec <過程名>;
2)、execute <過程名>;
3)、在PL/SQL語句塊中直接調(diào)用。
????????????函數(shù)的調(diào)用方式有:
在PL/SQL語句塊中直接調(diào)用。
???????????????? 具體分為:
----調(diào)用FUNCTION add_three_numbers
----1. 位置表示法調(diào)用函數(shù)
BEGIN
dbms_output.put_line(add_three_numbers(2,4,5));
END;
----2. 命名表示法調(diào)用函數(shù)
BEGIN
dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));
END;
----3. 混合使用位置表示法和命名表示法調(diào)用函數(shù)
BEGIN
dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));
END;
----4. 排除表示法
BEGIN
dbms_output.put_line(add_three_numbers(12,c=>2));
END;
----5. sql調(diào)用表示法 --混合表示法
SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;
?
----1. 該函數(shù)接受3個可選參數(shù),返回3個數(shù)字的和
CREATE OR REPLACE FUNCTION add_three_numbers
(
a NUMBER:=0, b NUMBER:=0, c NUMBER:=0
)
RETURN NUMBER IS
BEGIN
RETURN a+b+c;
END;
存儲過程:
基本語法:
create procedure <過程名>(<參數(shù)列表,無參時忽略>)
as|is
變量聲明、初始化
begin
業(yè)務處理、邏輯代碼
exception
異常捕獲、容錯處理
end <過程名>;
參數(shù):<參數(shù)名> in|out|in out <參數(shù)類型,無長度說明> ,如:v_name varchar2
in:入?yún)?/p>
out:出參
in out:出入?yún)?/p>
注:as|is表示as或is
調(diào)用語法:
1)、exec <過程名>;
2)、execute <過程名>;
3)、在PL/SQL語句塊中直接調(diào)用。
例:
create or replace procedure up_wap(v_param1 in out varchar2,v_param2 in out varchar2)
is
v_temp varchar2(20);
begin
dbms_output.put_line('交換前參數(shù)1:'||v_param1||' 參數(shù)2:'||v_param2);
v_temp:=v_param1;
v_param1:=v_param2;
v_param2:=v_temp;
dbms_output.put_line('交換后參數(shù)1:'||v_param1||' 參數(shù)2:'||v_param2);
exception
when others then dbms_output.put_line('There is a error when the procedure up_wap executing!');
end up_wap;
/
-- 調(diào)用存儲過程
declare
v_param1 varchar2(20):='param1';
v_param2 varchar2(20):='param2';
begin
up_wap(v_param1 => v_param1,v_param2 => v_param2);
end;
/
?
?自定義函數(shù)(function)
基本語法:
create function <函數(shù)名>(<參數(shù)列表,無參時忽略>)
return <返回值類型,無長度說明>
as|is
變量聲明、初始化
begin
業(yè)務處理、邏輯代碼
return <返回的值>;
exception
異常捕獲、容錯處理
end <函數(shù)名>;
參數(shù):in 入?yún)?/p>
注:只有入?yún)⒌念愋汀?/p>
在存儲過程和自定義函數(shù)中的參數(shù)的傳遞(入?yún)⒑统鰠?#xff09;不能使用%type或%rowtype匹配,不能使用空值null,但是存儲過程可以返回空值。
例:
create function uf_select_name_by_id_test(v_id in number)
return varchar2
is
v_name t_test.t_name%type;
begin
select t_name into v_name from t_test where t_id=v_id;
return v_name;
exception
when others then dbms_output.put_line('error');
end uf_select_name_by_id_test;
/
select uf_select_name_by_id_test(1) 姓名 from dual;-- select調(diào)用
declare --pl/sql語句塊調(diào)用
v_name varchar2(20);
begin
v_name:=uf_select_name_by_id_test(1);
dbms_output.put_line('name = '||v_name);
end;
/
總結
以上是生活随笔為你收集整理的存储过程和函数的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis集群部署及常用的操作命令_01
- 下一篇: IE11下用forms身份验证的问题