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模式的實參必須是變數。