1. 程式人生 > >ORACLE建立包和包體及包中函式和儲存過程

ORACLE建立包和包體及包中函式和儲存過程

背景:在Oracle資料庫建立包,在包建立函式Function和儲存過程Procedure。在java專案中呼叫。

建立包,並在下面宣告包含的函式和儲存過程:

create or replace package fpbjcs.pkg_fpyzjh is

  -- Public function and procedure declarations
  function get_fpyzjh_by_fjdm(fromDate in varchar2, toDate in varchar2)
    return fpsl_tab;

  function get_hjje_by_fjdm(fromDate in varchar2, toDate in varchar2)
    return fpsl_tab;

  function get_fpyzjh_by_cyc(fromDate in varchar2, toDate in varchar2)
    return fpsl2_tab;

  function get_hjje_by_cyc(fromDate in varchar2, toDate in varchar2)
    return fpsl2_tab;
end pkg_fpyzjh;

解釋說明:fpbjcs為Oracle表空間下的使用者。pkg_fpyzjh為包名。function後面是函式名稱,同時指定輸入引數和返回型別。

PL/SQL塊分為匿名塊與命名塊,命名塊又包含子程式、包和觸發器。

過程和函式統稱為PL/SQL子程式,我們可以將商業邏輯、企業規則寫成過程或函式儲存到資料庫中,以便共享。

過程和函式均儲存在資料庫中,並通過引數與其呼叫者交換資訊。過程和函式的唯一區別是函式總向呼叫者返回資料,而過程不返回資料。

1. 儲存過程概念

儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL語句集,儲存在資料庫中。經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。

儲存過程是資料庫中的一個重要物件,任何一個設計良好的資料庫應用程式都應該用到儲存過程。

2. 建立過程

語法:

CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name
   [ ( parameter_declaration [, parameter_declaration ]... ) ]
   [ invoker_rights_clause ]
   { IS | AS }
   { [ declare_section ] body | call_spec | EXTERNAL} ;

說明:

procedure_name:過程名稱。

parameter_declaration:引數宣告,格式如下:

parameter_name [ [ IN ] datatype [ { := | DEFAULT } expression ]
          | { OUT | IN OUT } [ NOCOPY ] datatype 

IN:輸入引數。

OUT:輸出引數。

IN OUT:輸入輸出引數。

invoker_rights_clause:這個過程使用誰的許可權執行,格式:

AUTHID { CURRENT_USER | DEFINER }

declare_section:宣告部分。

body:過程塊主體,執行部分。

一般只有在確認procedure_name過程是新過程或是要更新的過程時,才使用OR REPALCE關鍵字,否則容易刪除有用的過程。

3. 使用過程引數

當建立過程時,既可以指定過程引數,也可以不提供任何引數。

過程引數包括輸入引數、輸出引數和輸入輸出引數,其中輸入引數(IN)用於接收呼叫環境的輸入資料,輸出引數(OUT)用於將輸出資料傳遞到呼叫環境,而輸入輸出引數(IN OUT)不僅要接收輸入資料,而且還要輸出資料到呼叫環境。

5. 函式介紹

函式是一段獨立的PL/SQL程式程式碼,它執行某個特定的、明確的任務。通常,函式將處理從程式的呼叫部分傳遞給它的資訊,然後返回單個值。資訊通過稱為引數的特殊識別符號傳遞給函式,然後通過RETURN語句返回。

6. 建立函式

語法:

CREATE [ OR REPLACE ] FUNCTION [ schema. ] function_name
  [ ( parameter_declaration [, parameter_declaration]... ) 
  ]
  RETURN datatype
  [ { invoker_rights_clause
    | DETERMINISTIC
    | parallel_enable_clause
    | RESULT_CACHE  [ relies_on_clause ]
    }...
  ]
  { { AGGREGATE | PIPELINED }  USING [ schema. ] implementation_type
  | [ PIPELINED ] { IS | AS } { [ declare_section ] body 
                              | call_spec
                              | EXTERNAL
                              }
  } ;


示例1:

CREATE FUNCTION get_bal(acc_no IN NUMBER) 
   RETURN NUMBER 
   IS
     acc_bal NUMBER(11,2);
   BEGIN 
      SELECT order_total INTO acc_bal FROM orders 
      WHERE customer_id = acc_no; 
      RETURN(acc_bal); 
    END;

函式引數也有輸入、輸出、輸入輸出三種模式:IN、OUT、IN OUT是形參的模式。若省略,則為IN模式。

和過程一樣,IN模式的形參只能將實參傳遞給形參,進入函式內部,但只能讀不能寫,函式返回時實參的值不變。

OUT模式的形參會忽略呼叫時的實參值(或說該形參的初始值總是NULL),但在函式內部可以被讀或寫,函式返回時形參的值會賦予給實參。

IN OUT具有前兩種模式的特性,即呼叫時,實參的值總是傳遞給形參,結束時,形參的值傳遞給實參。

呼叫時,對於IN模式的實參可以是常量或變數,但對於OUT和IN OUT模式的實參必須是變數。