過程和函數都是命名塊,可以一次定義,多次調用。函數和過程的使用顯著的改善了代碼的可重用性,增加了可維護性。
過程是執行特定的任務(動作)的命名塊。過程封裝了業務邏輯,隨后在應用層和數據層都可調用之前已經定義的過程。
CREATE [OR REPLACE] PROCEDURE [schema.]name[( parameter [IN] [OUT] data_type[, parameter [IN] [OUT] data_type...] ) ][AUTHID DEFINER | CURRENT_USER]IS [--declarations statements]BEGIN --executable statements [ EXCEPTION ---exception handlers]END [name];在IS之前的部分叫做過程的頭部,即過程的簽名。
參數列表中參數的有三種模式,IN,OUT,INOUT。IN代表參數為只讀參數,如果在對該參數修改,編譯器將會報錯;OUT代表只寫參數,OUT參數用于返回數據到調用者,當過程執行時,無論之前OUT參數本來是什么值,它都會被初始化為對應類型的默認值;IN OUT表示參數為可讀可寫參數,過程內部可以讀取參數的值,也可以改變參數的值返回給調用者
AUTHID DEFINER | CURRENT_USER可選部分用于指定當前過程執行時是用過程所有者的權限還是執行時的當前用戶的權限
在IS之后的部分為過程體,結構和匿名塊很相似。
調用方式:
BEGIN --no parameter procedure_name; --or procedure_name(); --with papameter procedure_name(parameter...);END;函數用于計算然后返回一個值。函數和過程在結構上很類似,不同之處在于函數會通過RETURN返回值。在函數簽名部分,通過RETURN DATATYPE聲明返回的數據類型,在函數體中通過RETURN DATA返回結果DATA,類型為DATATYPE。
CREATE [OR REPLACE] FUNCTION [schema.]name[( parameter [IN] [OUT] data_type[, parameter [IN] [OUT] data_type...] ) ]RETURN DATATYPE[AUTHID DEFINER | CURRENT_USER]IS [--declarations statements]BEGIN --executable statementsRETURN DATA; [ EXCEPTION ---exception handlers]END [name];調用方式: 函數的調用方式和過程一樣,此外由于函數返回數據,所以可以用于賦值,也可以直接用于SQL中。
DECLARE variable RETURNDATATYPE;BEGIN variable := function_name(); variable := function_name(parameter...); INSERT INTO table VALUES (function_name(parameter...));END;對變量的命名規則同樣適用于過程和函數以及其他數據庫對象。不同點在于對于不是用雙引號聲明的標識符,數據庫都是以大寫的形式處理對待的。
CREATE OR REPLACE PROCEDURE hello_worldISBEGIN DBMS_OUTPUT.put_line ('Hello World!');END hello_world;上述過程在數據庫中的名字將是“HELLO_WORLD”,該過程可以被如下調用:
BEGIN hello_world; HELLO_WORLD; "HELLO_WORLD";END;但卻不能被如此調用:
BEGIN "hello_world";END;
|
新聞熱點
疑難解答