oracle中函數和存儲過程的區別和聯繫數據庫
在oracle中,函數和存儲過程是常常使用到的,他們的語法中有不少類似的地方,但也有本身的特色。剛學完函數和存儲過程,下面來和你們分享一下本身總結的關於函數和存儲過程的區別。oracle
1、存儲過程函數
1.定義spa
存儲過程是存儲在數據庫中提供全部用戶程序調用的子程序,定義存儲過程的關鍵字爲procedure。code
2.建立存儲過程orm
create [or replace] procedure 存儲過程名server
[(參數1 類型,參數2 out 類型……)] blog
asio
變量名 類型;編譯
begin
程序代碼體
end;
示例一:無參無返
create or replace procedure 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 procedure 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 dual; end; --執行存儲過程 set serveroutput on; declare msg varchar2(100); begin p2('張三',23,msg); dbms_output.put_line(msg); end;
示例三:參數列表中有in out參數
create or replace procedure 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 procedure p4 as --存儲過程當中定義的參數列表 name varchar(50); begin name := 'hello world'; dbms_output.put_line(name); end; ---執行存儲過程 set serveroutput on; execute p4();
總結:1.建立存儲過程的關鍵字爲procedure。
2.傳參列表中的參數能夠用in,out,in out修飾,參數類型必定不能寫大小。列表中能夠有多個輸入輸出參數。
3.存儲過程當中定義的參數列表不須要用declare聲明,聲明參數類型時須要寫大小的必定要帶上大小。
4.as能夠用is替換。
5.調用帶輸出參數的過程必需要聲明變量來接收輸出參數值。
6.執行存儲過程有兩種方式,一種是使用execute,另外一種是用begin和end包住。
存儲過程雖然有不少優勢,可是它卻不能使用return返回值。當須要使用return返回值時,咱們可使用函數。
2、存儲函數
1.函數與存儲過程的結構相似,可是函數必須有一個return子句,用於返回函數值。
create or replace function f1 return varchar--必須有返回值,且聲明返回值類型時不須要加大小 as msg varchar(50); begin msg := 'hello world'; return msg; end; --執行函數方式1 select f1() from dual; --執行函數方式2 set serveroutput on; begin dbms_output.put_line(f1()); end;
3、存儲過程與存儲函數的區別和聯繫
相同點:1.建立語法結構類似,均可以攜帶多個傳入參數和傳出參數。
2.都是一次編譯,屢次執行。
不一樣點:1.存儲過程定義關鍵字用procedure,函數定義用function。
2.存儲過程當中不能用return返回值,但函數中能夠,並且函數中必須有return子句。
3.執行方式略有不一樣,存儲過程的執行方式有兩種(1.使用execute2.使用begin和end),函數除了存儲過程的兩種方式外,還能夠當作表達式使用,例如放在select中(select f1() form dual;)。
總結:若是隻有一個返回值,用存儲函數,不然,通常用存儲過程。