區(qū)別:1、存儲(chǔ)過(guò)程用于在數(shù)據(jù)庫(kù)中完成特定的操作或任務(wù),而函數(shù)用于特定數(shù)據(jù);2、存儲(chǔ)過(guò)程的程序頭部聲明用PROCEDURE,聲明時(shí)不需要返回類型,而函數(shù)的程序頭部聲明用FUNCTION,聲明時(shí)要描述返回類型。
本教程操作環(huán)境:Windows7系統(tǒng)、Oracle 11g版、Dell G3電腦。
存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程(Stored Procedure )是一組為了完成特定功能的SQL 語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中。用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)中的一個(gè)重要對(duì)象,任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該用到存儲(chǔ)過(guò)程。 存儲(chǔ)過(guò)程是由流控制和SQL 語(yǔ)句書寫的過(guò)程,這個(gè)過(guò)程經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,應(yīng)用程序使用時(shí)只要調(diào)用即可。在ORACLE 中,若干個(gè)有聯(lián)系的過(guò)程可以組合在一起構(gòu)成程序包。
優(yōu) 點(diǎn):
1、存儲(chǔ)過(guò)程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過(guò)程都不需再重新編譯,而一般SQL語(yǔ)句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過(guò)程可提高數(shù)據(jù)庫(kù)執(zhí)行速度。
2、當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行Update、Insert、Query、Delete時(shí)),可將此復(fù)雜操作用存儲(chǔ)過(guò)程封裝起來(lái)與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用。
3、存儲(chǔ)過(guò)程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。
4、安全性高,可設(shè)定只有某用戶才具有對(duì)指定存儲(chǔ)過(guò)程的使用權(quán)。
存儲(chǔ)過(guò)程與函數(shù)的區(qū)別
二者最大的區(qū)別是:
1).函數(shù)(function)總是向調(diào)用者返回?cái)?shù)據(jù),并且一般只返回一個(gè)值;2).存儲(chǔ)過(guò)程(procedure)不直接返回?cái)?shù)據(jù),但可以改變輸出參數(shù)的值,這可以近似看作能返回值,且存儲(chǔ)過(guò)程輸出參數(shù)的值個(gè)數(shù)沒(méi)有限制。
從一般應(yīng)用上來(lái)看,如果不需要返回值或者需要多個(gè)返回值,使用存儲(chǔ)過(guò)程,如果只用一個(gè)返回值,就使用函數(shù)。
2、function定義中只能有DDL(如select等)語(yǔ)句;procedure中主要是DML語(yǔ)句(對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí),如對(duì)多個(gè)表進(jìn)行Update、Insert、Query、Delete時(shí))。
如果想要使用select的結(jié)果集,則要使用游標(biāo)
存儲(chǔ)過(guò)程 |
函數(shù) |
用于在數(shù)據(jù)庫(kù)中完成特定的操作或任務(wù)(如插入、刪除等) |
用于特定數(shù)據(jù)(如查詢返回值) |
程序頭部聲明用PROCEDURE |
程序頭部聲明用FUNCTION |
程序頭部聲明時(shí)不需要返回類型 |
程序頭部聲明時(shí)要描述返回類型,而且PL/SQL塊至少要包括一個(gè)有效的RETURN語(yǔ)句 |
可以使用IN/OUT/IN OUT3種參數(shù)模式 |
可以使用IN/OUT/IN OUT3種參數(shù)模式 |
可以作為獨(dú)立的PL/SQL語(yǔ)句執(zhí)行 |
不能獨(dú)立執(zhí)行,必須作為表達(dá)式的一部分調(diào)用 |
可以通過(guò)OUT/IN OUT返回零個(gè)或多個(gè)值 |
對(duì)過(guò)RETURN語(yǔ)句返回一個(gè)值,且該值與聲明部分一致,也可以通過(guò)OUT類型的參數(shù)帶出變量 |
SQL語(yǔ)句(DML或SELECT)中不可以調(diào)用存儲(chǔ)過(guò)程 |
SQL語(yǔ)句(DML或SELECT)中可以調(diào)用函數(shù) |
實(shí)際舉例
1、函數(shù)
(1)創(chuàng)建函數(shù)
create or replace function get_salary( dept_no number, emp_count **out** number) return number IS v_sum number;begin ...exception ...end get_salary
(2)調(diào)用函數(shù)
declare v_num number; v_sum number;begin ...(這里應(yīng)該出現(xiàn)函數(shù)名表示調(diào)用)end
2、存儲(chǔ)過(guò)程
(1)創(chuàng)建存儲(chǔ)過(guò)程
create or replace procedure pro_demo( dept_no number default 10, sal_sum out number, emp_count out number) IS begin ... exception ... end proc_demo;
(2)調(diào)用存儲(chǔ)過(guò)程
調(diào)用語(yǔ)法:
1)、exec <過(guò)程名>;
2)、execute <過(guò)程名>;
3)、在PL/SQL語(yǔ)句塊中直接調(diào)用。
例如:
declare v_num number; v_sum number(8,2); begin procedure pro_demo(dept_no=>1,sal_num=>900,emp_count=>10)(這里出現(xiàn)存儲(chǔ)過(guò)程名表示調(diào)用,傳遞參數(shù)值用=>) end;
3、本地存儲(chǔ)過(guò)程
在PL/SQL中還可以在declare塊中建立本地存儲(chǔ)過(guò)程,而不使用關(guān)鍵字create,其目的是:不用將存儲(chǔ)過(guò)程存儲(chǔ)在數(shù)據(jù)庫(kù)中,避免更改數(shù)據(jù)庫(kù)時(shí)帶來(lái)的麻煩,其主要的使用場(chǎng)景是,臨時(shí)使用某個(gè)存儲(chǔ)過(guò)程,而不是在以后要重復(fù)多次使用。
例子:
declare v_num number; v_sum number(8,2); procedure proc_demo( dept_no number default 10, sal_sum out number, emp_count out number) IS begin ...(這里不用出現(xiàn)存儲(chǔ)過(guò)程名) exception ... end proc_demo;
推薦教程:《Oracle教程》