存儲過程和函數的區別


存儲過程和函數目的是為了 可重復地 執行操作數據庫的sql語句的集合。

區別是寫法和調用上。

 

標識符不同:函數的標識符為FUNCTION;

      存儲過程為:PROCEDURE。

參數:   存儲過程的參數列表可以有輸入參數、輸出參數、可輸入輸出的參數;

            函數的參數列表只有輸入參數,並且有return <返回值類型,無長度說明>。

返回值上:

    存儲過程的返回值,可以有多個值,

           函數的返回值,只有一個值。

調用方式上:

    存儲過程的調用方式有:

1)、exec <過程名>;

2)、execute <過程名>;

3)、在PL/SQL語句塊中直接調用。

            函數的調用方式有:

      在PL/SQL語句塊中直接調用。

                 具體分為:

  ----調用FUNCTION add_three_numbers

  ----1. 位置表示法調用函數

  BEGIN

  dbms_output.put_line(add_three_numbers(2,4,5));

  END;

  ----2. 命名表示法調用函數

  BEGIN

  dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));

  END;

  ----3. 混合使用位置表示法和命名表示法調用函數

  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調用表示法 --混合表示法

  SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;

 

----1. 該函數接受3個可選參數,返回3個數字的和

  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 <過程名>(<參數列表,無參時忽略>)

as|is

變量聲明、初始化

begin

業務處理、邏輯代碼

exception

異常捕獲、容錯處理

end <過程名>;

參數:<參數名> in|out|in out <參數類型,無長度說明> ,如:v_name varchar2

in:入參

out:出參

in out:出入參

注:as|is表示as或is

調用語法:

1)、exec <過程名>;

2)、execute <過程名>;

3)、在PL/SQL語句塊中直接調用。

例:

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('交換前參數1:'||v_param1||' 參數2:'||v_param2);

v_temp:=v_param1;

v_param1:=v_param2;

v_param2:=v_temp;

dbms_output.put_line('交換后參數1:'||v_param1||' 參數2:'||v_param2);

exception

when others then dbms_output.put_line('There is a error when the procedure up_wap executing!');

end up_wap;

/

-- 調用存儲過程

declare

v_param1 varchar2(20):='param1';

v_param2 varchar2(20):='param2';

begin

up_wap(v_param1 => v_param1,v_param2 => v_param2);

end;

/

 

 自定義函數(function)

基本語法:

create function <函數名>(<參數列表,無參時忽略>)

return <返回值類型,無長度說明>

as|is

變量聲明、初始化

begin

業務處理、邏輯代碼

return <返回的值>;

exception

異常捕獲、容錯處理

end <函數名>;

參數:in 入參

注:只有入參的類型。

在存儲過程和自定義函數中的參數的傳遞(入參和出參)不能使用%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調用

declare --pl/sql語句塊調用

v_name varchar2(20);

begin

v_name:=uf_select_name_by_id_test(1);

dbms_output.put_line('name = '||v_name);

end;

/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM