ORACLE建立和使用子程式和包

2021-06-22 15:53:58 字數 3159 閱讀 8686

匿名plsql程式:

1.用文字編輯器書寫**,在sql*plus中執行。

2.**可以儲存在檔案系統中。

3.不能被其他程式呼叫,也不能被其他使用者執行。

4.不能接受引數,也不能傳遞引數。

命名pl/sql程式:

儲存:1.以編譯物件的方式儲存在資料庫中。2.以庫檔案的方式儲存在檔案系統中。

能被其它程式呼叫。

能被其他使用者執行。

伺服器端:1.以資料庫物件的方式儲存在資料庫中。2.在伺服器上執行。

客戶端:1.儲存在客戶端的檔案系統中。2.在客戶端執行。

命名pl/sql程式型別:

程式單元(儲存在客戶端或伺服器段)1.過程(procedures),2.函式(functions)

庫檔案(libraries儲存在客戶端)

包(packages儲存在客戶端或伺服器端)

觸發器(triggers儲存在伺服器端)

程式單元:

過程(procedures):1.可以接受和傳遞多個引數。2.可以呼叫其它程式單元。

函式(functions):與過程類似,但必須有乙個返回值。

引數:1.用於向程式單元傳入或程式單元用於傳出資料的變數。

2.在過程的頭部進行宣告。

3.呼叫過程時,呼叫者要向被呼叫的過程傳遞引數值。

引數的模式:

1.傳入引數(in):用於向過程傳入資料,唯讀型。

2.傳出引數(out):用於接收過程輸出資料,只寫型。

3.傳入傳出引數(in out):既可以i向過程傳入資料,也可以接受過程傳出資料,可讀可寫型。

建立過程:

create or replace procedure procedure_name

(parameter1 mode datatype,

parameter2 mode datatype,...

)is | as

local variable declarations

begin

program statements

exception

exception handlers

end;

引數的型別:

形式引數:在過程頭部宣告。

實際引數:由過程呼叫者在施用時提供。

兩者要匹配型別、數量和順序

在sql/plus中除錯程式:

1.定位出錯的程式行並糾正錯誤。

2.用show errors命令檢視出錯的詳細資訊。

3.dbms_output.put_line命令輸出中間結果,以此來跟蹤程式的流程。

建立函式:

create or replace function function_name

(parameter1 mode datatype,

parameter2 mode datatype,...)

return function_return_data_type

is local variable declarations

begin

program statements

return return_value;

exception

exception handlers

return exception_notice;

end;

return 命令:

1.在函式頭部的return命令用於定於函式返回值得型別。

2.在函式體的return命令用於傳遞函式的實際返回值。

3.retuen exception_notice返回函式呼叫過程中的出錯資訊。

函式呼叫:

1.可以被其它過程和函式或匿名pl/sql塊呼叫。

2.也可以再sql語句中進行呼叫

return_value := function(parameter1_value,....);

儲存單元的物件許可權:

1.儲存程式單元可以看做是乙個資料庫物件。

2.要允許其它使用者使用你的程式單元,必須給該使用者授予excute許可權。

使用其他使用者下的儲存單元:

1.你必須被授予相應的執行許可權。

2.呼叫時在物件名前加上該物件所有者的使用者名稱

return_value:=lhoward.my_function to_date('01/02/1112','mm/dd/yyyy');

呼叫其他使用者的過程:

使用過程名稱,並為之提供相應的引數值的列表:procedure_name(parameter1_value, parameter2_value...);

程式單元的依賴性:

物件依賴:程式單元依賴於它所引用的資料庫物件(表,檢視,序列等。。。)

程式依賴:程式單元依賴於它所呼叫的其它程式單元。

直接依賴和間接依賴:

直接依賴:直接呼叫的程式或引用的資料庫物件。

間接依賴:通過子程式呼叫的程式或引用的資料庫物件。

有效性驗證:如果乙個資料庫物件或程式單元發生了改變,則引用該物件或者呼叫該程式單元的程式

必須要重新進行編譯。

包:1.儲存在伺服器端的程式庫,2.包含,全域性變數的宣告,游標的定義,過程,函式。

2.庫總是執行在客戶端。3.包總是執行在伺服器端。

包的組成:

定義部分:用於宣告所有的公共變數,游標,過程和函式。

包體部分:過程和函式的**。

基本原理:1.定義部分對使用者是可見的,說明如何使用包。2.包體部分是不可見的,使用者不會關心具體的**

在pl/plus中建立包

create or replace package package_name is

variable_name datatype;

prodedure procedure_name(parameter_list)

function function_name(parameter_list);

end; 

呼叫包中的程式單元:

在過程名前加上其所在的包和名稱:package_name.program_unit_name(parameter_list);

例如:dbms_output.put_line('hello world');

程式的過載:

過載:1.多個程式單元具有相同的名稱,但接受不同的資料和型別的引數。

2.允許使用者使用相同的命令,通過提供不同的引數,完成不同的呼叫請求。

Oracle 子程式內聯

start 如果子程式 a 呼叫 b,內聯可以把 b 的 合併到 a 中,從而減少子程式呼叫,提高效能,下面是乙個簡單的例子。子程式 a procedure a isbegin 指定下面的子程式 b 內聯 pragma inline b,yes b 1 注意此處的子程式不會內聯 b 2 end a ...

(oracle)如何建立和使用procedure

1 定義procedure 在高階程式語言中的模組的概念 create or replace procedure procedure name param 1 in type param 2 in out type as param inner type begin statement end a ...

Oracle中的子程式和包

在oracle中通過使用子程式和包將pl sql 封裝起來,從而實現模組化,在以後的呼叫中可以多次復用,而不受前台語言的限制,同時通過用子程式和包將pl sql 封裝起來,有利於提高開發效率和執行效率,但是維護性卻沒有物件導向靈活,如果乙個子程式受到影響,就需要修改該子程式的定義。在oracle中子...