商業規則和業務邏輯可以通過程序存儲在oracle中,這個程序就是存儲過程。
存儲過程是SQL, PL/SQL, JAVA 語句的組合, 它使你能將執行商業規則的代碼從從你的應用程序中移動到數據庫。這樣的結果就是,代碼存儲一次但是能夠被多個程序使用。
要創建一個 過程對象(procedural object),必須有 CREATE PROCEDURE 系統權限。如果這個過程對象需要被其他的用戶schema 使用,那么你必須有 CREATE ANY PROCEDURE 權限。
執行 procedure 的時候,可能需要excute權限。或者EXCUTE ANY PROCEDURE 權限。
如果單獨賦予權限,如下例所示: grant execute on MY_PROCEDURE to Jelly
調用一個存儲過程的例子: execute MY_PROCEDURE( 'ONE PARAMETER');
PROCEDURE 和 FUNCTION 的區別。 function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。
PACKAGE 是function,procedure,variables 和sql 語句的組合。package允許多個procedure使用同一個變量和游標。
創建 procedure的語法:
CREATE [ OR REPLACE ] PROCEDURE [ schema.]procedure
[(argument [IN | OUT | IN OUT ] [NO COPY] datatype
[, argument [IN | OUT | IN OUT ] [NO COPY] datatype]...
)]
[ authid { current_user | definer }]
{ is | as } { pl/sql_subprogram_body |
language { java name 'String' | c [ name, name] library lib_name
}]
sql 代碼
- CREATE PROCEDURE sam.credit (acc_no IN NUMBER, amount IN NUMBER) AS
- BEGIN
- UPDATE accounts
- SET balance = balance + amount
- WHERE account_id = acc_no;
- END;
可以使用 create or replace procedure 語句, 這個語句的用處在于,你之前賦予的excute權限都將被保留。
IN, OUT, IN OUT 用來修飾參數。IN 表示這個變量必須被調用者賦值然后傳入到PROCEDURE進行處理。OUT 表示PRCEDURE 通過這個變量將值傳回給調用者。IN OUT 則是這兩種的組合。
authid代表兩種權限: 定義者權限(difiner right 默認),執行者權限(invoker right)。定義者權限說明這個procedure中涉及的表,視圖等對象所需要的權限只要定義者擁有權限的話就可以訪問。執行者權限則需要調用這個procedure的用戶擁有相關表和對象的權限。
posted on 2007-07-02 15:46
Zhangwenlong 閱讀(803)
評論(1) 編輯 收藏