1. 程式人生 > >oracle數據庫之存儲函數和過程

oracle數據庫之存儲函數和過程

啟動 命令 describe 指定 ret soft 字典 調用 log

一、引言

ORACLE 提供可以把 PL/SQL 程序存儲在數據庫中,並可以在任何地方來運行它。這樣就叫存儲過程或函數。過程和函數統稱為 PL/SQL 子程序,他們是被命名的 PL/SQL 塊,均存儲在數據庫中,並通過輸入、輸出參數或輸入/輸出參數與其調用者交換信息。過程和函數的唯一區別是函數總向調用者返回數據,而過程則不返回數據

二、 創建函數

(一)建立內嵌函數

語法如下:

CREATE [OR REPLACE] FUNCTION function_name

[ (argment [ { IN | IN OUT }] Type,

argment [ { IN | OUT | IN OUT

} ] Type ]

[ AUTHID DEFINER | CURRENT_USER ]

RETURN return_type

{ IS | AS }

<類型.變量的說明>

BEGIN

FUNCTION_body

EXCEPTION

其它語句

END;

說明:

1) OR REPLACE 為可選. 有了它, 可以或者創建一個新函數或者替換相同名字的函數, 而不會出現沖突

2) 函數名後面是一個可選的參數列表, 其中包含 IN, OUT 或 IN OUT 標記. 參數之間用逗號隔開. IN 參數標記表示傳遞給函數的值在該函數執行中不改變; OUT 標記表示一個值在函數中進行計算並通過該參數傳遞給調用語句

; IN OUT 標記表示傳遞給函數的值可以變化並傳遞給調用語句. 若省略標記, 則參數隱含為 IN

3) 因為函數需要返回一個值, 所以 RETURN 包含返回結果的數據類型.

1. 不帶參數的函數

技術分享

技術分享

2. 獲取某部門的工資總和:

技術分享

(二)內嵌函數的調用

函數聲明時所定義的參數稱為形式參數,應用程序調用時為函數傳遞的參數稱為實際參數。應用程序在調用函數時,可以使用以下三種方法向函數傳遞參數:

第一種參數傳遞格式稱為位置表示法,格式為:

argument_value1[,argument_value2 …]

3計算某部門的工資總和:

技術分享

第二種參數傳遞格式稱為

名稱表示法,格式為:

argument => parameter [,…]

其中:argument 為形式參數,它必須與函數定義時所聲明的形式參數名稱相同。Parameter 為實際參數。

在這種格式中,形勢參數與實際參數成對出現,相互間關系唯一確定,所以參數的順序可以任意排列。

4計算某部門的工資總和:

技術分享

第三種參數傳遞格式稱為混合表示法

即在調用一個函數時,同時使用位置表示法和名稱表示法為函數傳遞參數。采用這種參數傳遞方法時,使用位置表示法所傳遞的參數必須放在名稱表示法所傳遞的參數前面。也就是說,無論函數具有多少個參數,只要其中有一個參數使用名稱表示法,其後所有的參數都必須使用名稱表示法。

5

技術分享

無論采用哪一種參數傳遞方法,實際參數和形式參數之間的數據傳遞只有兩種方法:傳址法和傳值法。所謂傳址法是指在調用函數時,將實際參數的地址指針傳遞給形式參數,使形式參數和實際參數指向內存中的同一區域,從而實現參數數據的傳遞。這種方法又稱作參照法,即形式參數參照實際參數數據。輸入參數均采用傳址法傳遞數據。

傳值法是指將實際參數的數據拷貝到形式參數,而不是傳遞實際參數的地址。默認時,輸出參數和輸入/輸出參數均采用傳值法。在函數調用時,ORACLE 將實際參數數據拷貝到輸入/輸出參數,而當函數正常運行退出時,又將輸出形式參數和輸入/輸出形式參數數據拷貝到實際參數變量中。

(三)參數默認值

在 CREATE OR REPLACE FUNCTION 語句中聲明函數參數時可以使用 DEFAULT 關鍵字為輸入參數指定默認值

6

技術分享

具有默認值的函數創建後,在函數調用時,如果沒有為具有默認值的參數提供實際參數值,函數將使用該參數的默認值。但當調用者為默認參數提供實際參數時,函數將使用實際參數值。在創建函數時,只能為輸入參數設置默認值,而不能為輸入/輸出參數設置默認值

三、存儲過程

(一) 建立存儲過程:

在 ORACLE SERVER 上建立存儲過程,可以被多個應用程序調用,可以向存儲過程傳遞參數,也可以向存儲過程傳回參數.

(二)創建過程語法:

CREATE [OR REPLACE] PROCEDURE Procedure_name

[ (argment [ { IN | IN OUT }] Type,

argment [ { IN | OUT | IN OUT } ] Type ]

[ AUTHID DEFINER | CURRENT_USER ]

{ IS | AS }

<類型.變量的說明>

BEGIN

<執行部分>

EXCEPTION

<可選的異常錯誤處理程序>

END;

7刪除指定員工記錄;

技術分享

8插入員工記錄;

技術分享

(三) 調用存儲過程

ORACLE 使用 EXECUTE 語句來實現對存儲過程的調用:

EXEC[UTE] Procedure_name( parameter1, parameter2…);

9查詢指定員工記錄;

技術分享

調用方法:

技術分享

10計算指定部門的工資總和,並統計其中的職工數量。

技術分享

調用方法:

技術分享

(四)AUTHID

在創建存儲過程時, 可使用 AUTHID CURRENT_USER 或 AUTHID DEFINER 選項,以表明在執行該過程時 Oracle 使用的權限.

1) 如果使用 AUTHID CURRENT_USER 選項創建一個過程, 則 Oracle 用調用該過程的用戶權限執行該過程. 為了成功執行該過程, 調用者必須具有訪問該存儲過程體中引用的所有數據庫對象所必須的權限

2) 如果用默認的 AUTHID DEFINER 選項創建過程, 則 Oracle 使用過程所有者的特權執行該過程.為了成功執行該過程, 過程的所有者必須具有訪問該存儲過程體中引用的所有數據庫對象所必須的權限. 想要簡化應用程序用戶的特權管理, 在創建存儲過程時, 一般選擇 AUTHID DEFINER 選項 –-- 這樣就不必授權給需要調用的此過程的所有用戶了.

(五) 開發存儲過程步驟

開發存儲過程、函數、包及觸發器的步驟如下:

1、 使用文字編輯處理軟件編輯存儲過程源碼

使用文字編輯處理軟件編輯存儲過程源碼,需將源碼存為文本格式。

2、SQLPLUS 或用調試工具將存儲過程程序進行解釋

在 SQLPLUS 或用調試工具將存儲過程程序進行解釋;

在 SQL>下調試,可用 START 或 GET 等 ORACLE 命令來啟動解釋。如:

SQL>START c:\stat1.sql

3、 調試源碼直到正確

我們不能保證所寫的存儲過程達到一次就正確。所以這裏的調式是每個程序員必須進行的工作之一。

在 SQLPLUS 下來調式主要用的方法是:

(1)、使用 SHOW ERROR 命令來提示源碼的錯誤位置

(2)、使用 user_errors 數據字典來查看各存儲過程的錯誤位置。

4、 授權執行權給相關的用戶或角色

如果調式正確的存儲過程沒有進行授權,那就只有建立者本人才可以運行。所以作為應用系統的一部分的存儲過程也必須進行授權才能達到要求。在 SQL*PLUS 下可以用 GRANT 命令來進行存儲過程的運行授權。

GRANT EXECUTE ON dbms_job TO PUBLIC WITH GRANT OPTION

5、 與過程相關數據字典

USER_SOURCE, ALL_SOURCE, DBA_SOURCE, USER_ERRORS

相關的權限:

CREATE ANY PROCEDURE

DROP ANY PROCEDURE

在 SQL*PLUS 中,可以用 DESCRIBE 命令查看過程的名字及其參數表

DESCRIBE Procedure_name;

(六) 刪除過程和函數

1.刪除過程

可以使用 DROP PROCEDURE 命令對不需要的過程進行刪除,語法如下:

DROP PROCEDURE [user.]Procudure_name;

2.刪除函數

可以使用 DROP FUNCTION 命令對不需要的函數進行刪除,語法如下:

DROP FUNCTION [user.]Function_name;

oracle數據庫之存儲函數和過程