Oracle基礎 自定義函數


一、函數

  函數與存儲過程相似,也是數據庫中存儲的已命名PL-SQL程序塊。函數的主要特征是它必須有一個返回值。通過return來指定函數的返回類型。在函數的任何地方可以通過return expression語句從函數返回,返回類型必須和聲明的返回類型一致。

  語法:

  create [or replace] function function_name

  [(parameter_list)]

  return datatype

  {is/as}

  [local_declarations]

  begin

    executable_statements;

  [exception

    exception_handlers;]

  end;

  說明:

  function_name:函數名稱。

  parameter_list:函數列表,可選。

  return 自居:指定函數的返回類型,不能指定大小。

  local_declarations:局部變量聲明,可選。

  executable_statements:要執行的PL-SQL語句。

  exception_handlers:異常處理,可選。

  or repalce:是否覆蓋,可選。

 

  例:根據員工編號獲得員工薪水。  

--根據no查詢sal
CREATE OR REPLACE FUNCTION fun_getSal(eno NUMBER)
RETURN NUMBER   --返回類型
AS
v_sal emp.sal%TYPE;
BEGIN
  SELECT sal INTO v_sal FROM emp WHERE empno = eno;
  RETURN v_sal;
  EXCEPTION
    WHEN OTHERS THEN
      raise_application_error(-20012,'該雇員不存在');
END fun_getSal;

  調用函數:

--調用函數,自定義異常處理
DECLARE 
  v_sal NUMBER;
  emp_20012 EXCEPTION;
  PRAGMA EXCEPTION_INIT(emp_20012,-20012);
BEGIN
  v_sal:=fun_getsal(7788);
  dbms_output.put_line('sal:'||v_sal);
  EXCEPTION
    WHEN emp_20012 THEN
      dbms_output.put_line('該雇員不存在');
END;

  注意:

  1、函數參數和返回類型只聲明參數,不指定大小。

  2、可執行部分至少有一條return語句。

  3、調用函數時,不能將函數作為單獨的語句存在,可以作為表達式的一部分。

 

 

二、函數和存儲過程的優點:

  1、共同使用的代碼可以只需要被編寫一次,而被需要該代碼的任何應用程序調用(.net,c++,java,也可以使DLL庫)。

  2、這種幾種編寫、幾種維護更新、大家共享的方法,簡化了應用程序的開發維護,提高了效率和性能。

  3、這種模塊化的方法使得一個復雜的問題、大的程序逐步簡化成幾個簡單的、小的程序部分,進行分別編寫,因此程序的結構更加清晰,簡單,也容易實現。

  4、可以在各個開發者之間提供處理數據、控制流程、提示信息等方面的一致性。

  5、節省內存空間。它們以一種壓縮的形式被存儲在外存中,當被調用時才被放入內存進行處理。而且多個用戶在調用同一個存儲過程或函數時,只需要加載一次即可。

  6、提高數據的安全性和完整性。通過把一些對數據的操作方到存儲過程或函數中,就可以通過是否授予用戶有執行該語句的權限,來限制某些用戶對數據庫進行這些操作。

 

三、函數和存儲過程的區別:

  1、存儲過程用戶在數據庫中完成特定操作或者任務(如插入,刪除等),函數用於返回特定的數據。

  2、存儲過程聲明用procedure,函數用function。

  3、存儲過程不需要返回類型,函數必須要返回類型。

  4、存儲過程可作為獨立的pl-sql執行,函數不能作為獨立的plsql執行,必須作為表達式的一部分。

  5、存儲過程只能通過out和in/out來返回值,函數除了可以使用out,in/out以外,還可以使用return返回值。

  6、sql語句(DML或SELECT)中不可用調用存儲過程,而函數可以。

 

四、適用場合:

  1、如果需要返回多個值和不返回值,就使用存儲過程;如果只需要返回一個值,就使用函數。

  2、存儲過程一般用於執行一個指定的動作,函數一般用於計算和返回一個值。

  3、可以再SQL內部調用函數來完成復雜的計算問題,但不能調用存儲過程。


免責聲明!

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



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