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

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;)。

總結:若是隻有一個返回值,用存儲函數,不然,通常用存儲過程。

相關文章
相關標籤/搜索