當前位置:首頁 » 存儲配置 » oracle的存儲過程和函數的區別

oracle的存儲過程和函數的區別

發布時間: 2025-09-14 05:40:28

Ⅰ oracle中函數和存儲過程的區別和聯系

在oracle中,函數和存儲過程是經常使用到的,他們的語法中有很多相似的地方,但也有自己的特點。剛學完函數和存儲過程,下面來和大家分享一下自己總結的關於函數和存儲過程的區別。
一、存儲過程

1.定義

存儲過程是存儲在資料庫中提供所有用戶程序調用的子程序,定義存儲過程的關鍵字為procere。

2.創建存儲過程

create [or replace] procere 存儲過程名

[(參數1 類型,參數2 out 類型……)]

as

變數名類型;

begin

程序代碼體

end;

示例一:無參無返

create or replace procere p1
--or replace代表創建該存儲過程時,若存儲名存在,則替換原存儲過程,重新創建
--無參數列表時,不需要寫()
as
begin
dbms_output.put_line('hello world');
end;

--執行存儲過程方式1
set serveroutput on;
begin
p1();
end;
--執行存儲過程方式2
set serveroutput on;
execute p1();

示例二:有參有返

create or replace procere p2
(name in varchar2,age int,msg out varchar2)
--參數列表中,聲明變數類型時切記不能寫大小,只寫類型名即可,例如參數列表中的name變數的聲明
--參數列表中,輸入參數用in表示,輸出參數用out表示,不寫時默認為輸入參數。
------------輸入參數不能攜帶值出去,輸出參數不能攜帶值進來,當既想攜帶值進來,又想攜帶值出去,可以用in out
as
begin
msg:='姓名'||name||',年齡'||age;
--賦值時除了可以使用:=,還可以用into來實現
--上面子句等價於select '姓名'||name||',年齡'||age into msg from al;
end;
--執行存儲過程
set serveroutput on;
declare
msg varchar2(100);
begin
p2('張三',23,msg);
dbms_output.put_line(msg);
end;

示例三:參數列表中有in out參數

create or replace procere p3
(msg in out varchar2)
--當既想攜帶值進來,又想攜帶值出去,可以用in out
as
begin
dbms_output.put_line(msg); --輸出的為攜帶進來的值
msg:='我是從存儲過程中攜帶出來的值';
end;

--執行存儲過程
set serveroutput on;
declare
msg varchar2(100):='我是從攜帶進去的值';
begin
p3(msg);
dbms_output.put_line(msg);
end;

示例四:存儲過程中定義參數

create or replace procere p4
as
--存儲過程中定義的參數列表
name varchar(50);
begin
name := 'hello world';
dbms_output.put_line(name);
end;
---執行存儲過程
set serveroutput on;
execute p4();

總結:1.創建存儲過程的關鍵字為procere。

2.傳參列表中的參數可以用in,out,in out修飾,參數類型一定不能寫大小。列表中可以有多個輸入輸出參數。

3.存儲過程中定義的參數列表不需要用declare聲明,聲明參數類型時需要寫大小的一定要帶上大小。

4.as可以用is替換。

5.調用帶輸出參數的過程必須要聲明變數來接收輸出參數值。

6.執行存儲過程有兩種方式,一種是使用execute,另一種是用begin和end包住。

存儲過程雖然有很多優點,但是它卻不能使用return返回值。當需要使用return返回值時,我們可以使用函數。

二、存儲函數

1.函數與存儲過程的結構類似,但是函數必須有一個return子句,用於返回函數值。

create or replace function f1
return varchar--必須有返回值,且聲明返回值類型時不需要加大小
as
msg varchar(50);
begin
msg := 'hello world';
return msg;
end;

--執行函數方式1
select f1() from al;
--執行函數方式2
set serveroutput on;
begin
dbms_output.put_line(f1());
end;

三、存儲過程與存儲函數的區別和聯系

相同點:1.創建語法結構相似,都可以攜帶多個傳入參數和傳出參數。

2.都是一次編譯,多次執行。

不同點:1.存儲過程定義關鍵字用procere,函數定義用function。

2.存儲過程中不能用return返回值,但函數中可以,而且函數中必須有return子句。

3.執行方式略有不同,存儲過程的執行方式有兩種(1.使用execute2.使用begin和end),函數除了存儲過程的兩種方式外,還可以當做表達式使用,例如放在select中(select f1() form al;)。

總結:如果只有一個返回值,用存儲函數,否則,一般用存儲過程。

Ⅱ Oracle 存儲過程和函數的區別

Oracle中函數和存儲過程僅體現在一個地方:


  1. 函數有返回值,而存儲過程沒有返回值(當然,兩者都可以通過定義out參數來實現返回值)


其實,Oracle函數和存儲過程差別很小,對比其他資料庫,比如sqlServer:

  1. sqlserver中,函數是不能存在非select的dml語句的,換句話說,函數中,sqlserver是不能出現update、delete、insert等語句的

  2. 而Oracle中,是十分自由和寬容的,update、delete、insert等語句都可以出現

  3. 但因為Oracle的自由度,會引起其它一些問題:如果使用C#來調用Oracle的函數時,會出現因函數含有update等語句而無法調用,只能換成存儲過程或者在函數外再加一層存儲過程來實現調用。

Ⅲ Oracle中存儲過程和函數的區別

定義:
存儲過程(Stored Procere )是一組為了完成特定功能的SQL 語句集,經編譯後存儲在資料庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程

帶有參數)來執行它。

存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。

存儲過程是由流控制和SQL 語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中,應用程序使用時只要調用即可。

在ORACLE 中,若干個有聯系的過程可以組合在一起構成程序包。

優 點:

1. 存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。

2.當對資料庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。

3.存儲過程可以重復使用,可減少資料庫開發人員的工作量。

4.安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。

存儲過程與函數的對比

存儲過程的優缺點
優點:減少網路交互的成本。
缺點:
a、不可移植性,每種資料庫的內部編程語法都不太相同,當你的系統需要兼容多種資料庫時,最好不要用存儲過程。
b、學習成本高,DBA一般都擅長寫存儲過程,但並不是每個程序員都能寫好存儲過程,除非你的團隊有較多的開發人員熟悉寫存儲過程,否則後期系統維護會產生問題。
c、業務邏輯多處存在,採用存儲過程後也就意味著你的系統有一些業務邏輯不是在應用程序里處理,這種架構會增加一些系統維護和調試成本。
d、存儲過程和常用應用程序語言不一樣,它支持的函數及語法有可能不能滿足需求,有些邏輯就只能通過應用程序處理。
e、如果存儲過程中有復雜運算的話,會增加一些資料庫服務端的處理成本,對於集中式資料庫可能會導致系統可擴展性問題。
f、為了提高性能,資料庫會把存儲過程代碼編譯成中間運行代碼(類似於java的class文件),所以更像靜態語言。當存儲過程引用的對像(表、視圖等等)結構改變後,
存儲過程需要重新編譯才能生效,在24*7高並發應用場景,一般都是在線變更結構的,所以在變更的瞬間要同時編譯存儲過程,這可能會導致資料庫瞬間壓力上升引起故障(Oracle資料庫就存在這樣的問題)。

Ⅳ Oracle中 存儲過程,過程和函數有什麼區別和聯系

過程:函數和存儲過程的統稱。

函數:有且僅有一個返回值,可以用於SQL語句中。 如:x := get_X(),select get_X() from al,返回值為函數調用的結果。

存儲過程:無返回值。要返回結果,必須聲明為out參數。
如:sp_x(x,y,z),x和y為in類型參數,z為out/in out類型參數。

在oracle中,封裝工具還有自定義類型、包等。包可以封裝過程和函數,包頭類似JAVA中的介面,包體類似JAVA中實現介面的類。

Ⅳ oracle函數和存儲過程有什麼區別

一、主體不同

1、函數:當需要分析數據清單中的數值是否符合特定條件時,使用資料庫工作表函數。

2、存儲過程:是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,存儲在資料庫中,一次編譯後永久有效。

二、特點不同

1、函數:只能返回一個變數,可以嵌入sql中和存儲過程中使用。

2、存儲過程:用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行。存儲過程是資料庫中的一個重要對象。在數據量特別龐大的情況下利用存儲過程能達到倍速的效率提升。


三、功能不同

1、函數:不能用臨時表,只能用表變數,函數不能執行一組修改全局資料庫狀態的操作。可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,所以在查詢中位於from關鍵字後面。

2、存儲過程:存儲過程需要讓sql的query可以執行,存儲過程可以返回參數,如記錄集。sql語句中不可以含有存儲過程。


熱點內容
pythonif寫一行 發布:2025-09-14 07:41:39 瀏覽:990
lua存儲數據 發布:2025-09-14 07:33:05 瀏覽:109
教你如何選配置車 發布:2025-09-14 07:32:21 瀏覽:415
行李箱自帶的密碼是多少 發布:2025-09-14 07:27:40 瀏覽:276
ps2020版本怎麼調整存儲盤 發布:2025-09-14 07:20:28 瀏覽:858
奧迪a6哪個配置最保值 發布:2025-09-14 07:11:53 瀏覽:984
android查看文件 發布:2025-09-14 07:00:37 瀏覽:289
carlyle壓縮機 發布:2025-09-14 06:16:51 瀏覽:976
支持ftp免費空間 發布:2025-09-14 06:05:16 瀏覽:206
android橫屏生命周期 發布:2025-09-14 05:55:27 瀏覽:421