Oracle 自定義函式

風靈使發表於2018-10-21

一、函式

函式與儲存過程相似,也是資料庫中儲存的已命名PL-SQL程式塊。函式的主要特徵是它必須有一個返回值。通過return來指定函式的返回型別。在函式的任何地方可以通過return expression語句從函式返回,返回型別必須和宣告的返回型別一致。

語法:


  create [or replace] function function_name

  [(parameter_list)]

  return datatype

  {is/as}

  [local_declarations]

  begin

    executable_statements;

  [exception_handlers;]

  end;

說明:

function_name:函式名稱。

parameter_list:函式列表,可選。

return datatype:指定函式的返回型別,不能指定大小。

local_declarations:區域性變數宣告,可選。

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

exception_handlers:異常處理,可選。

or repalce:是否覆蓋,可選。

簡單的例子: 讀入兩個值, 返回比較大的值


    create or replace function function1(para1 in number, para2 in number)   
    return number   
    as   
    begin  
      if para1 > para2 then  
          return para1;  
      else  
          return para2;   
      end if;  
    end function1;  

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

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內部呼叫函式來完成複雜的計算問題,但不能呼叫儲存過程。


Oracle之自定義函式

資料庫中函式包含四個部分:宣告、返回值、函式體和異常處理。

Sql程式碼

    --沒有引數的函式  
    create or replace function get_user return varchar2 is  
      v_user varchar2(50);  
    begin  
      select username into v_user from user_users;  
      return v_user;  
    end get_user;  

–測試

方法一

    select get_user from dual;  

方法二

    SQL> var v_name varchar2(50)  
    SQL> exec :v_name:=get_user; 
    PL/SQL 過程已成功完成。   
    SQL> print v_name  
      
    V_NAME  
    ------------------------------  
    TEST  

方法三

    SQL> exec dbms_output.put_line('當前資料庫使用者是:'||get_user);  
    當前資料庫使用者是:TEST  
    PL/SQL 過程已成功完成。  

Sql程式碼

    --帶有IN引數的函式  
    create or replace function get_empname(v_id in number) return varchar2 as  
      v_name varchar2(50);  
    begin  
      select name into v_name from employee where id = v_id;  
       return v_name;  
    exception  
      when no_data_found then  
        raise_application_error(-20001, '你輸入的ID無效!');  
    end get_empname;  

附:

函式呼叫限制
1、SQL語句中只能呼叫儲存函式(伺服器端),而不能呼叫客戶端的函式
2、SQL只能呼叫帶有輸入引數,不能帶有輸出,輸入輸出函式
3、SQL不能使用PL/SQL的特有資料型別(boolean,table,record等)
4、SQL語句中呼叫的函式不能包含INSERT,UPDATE和DELETE語句

檢視函式院原始碼
oracle會將函式名及其原始碼資訊存放到資料字典中user_source

select text from user_source where name='GET_EMPNAME';

刪除函式

drop function get_empname;

相關文章