Oracle 包概述


包是 SQL 過程、函式、變數、語句等組合成單個單元的集合。許多不同的應用程式可以共享包的內容,因為它儲存在資料庫中。

包的組成部分

以下是 Oracle 包的組成部分:

包規範

包規範包含有關儲存在其內部的所有過程、函式、變數、常量等的資訊。它包含所有元件的宣告,但不包含程式碼。

規範中的所有物件都稱為公共物件。如果規範中不存在但在主體中編碼的任何物件,則稱為私有物件。

包規範的語法:

CREATE [OR REPLACE] PACKAGE name_of_package
IS | AS
[declaration_of_variable ...]
[declaration_of_constant ...]
[declaration_of_exception ...]
[cursor_specification ...]
[PROCEDURE [Schema..] name_of_procedure
[ (parameter {IN,OUT,IN OUT} datatype [,parameter]) ]
]
[FUNCTION [Schema..] name_of_function
[ (parameter {IN,OUT,IN OUT} datatype [,parameter]) ]
RETURN return_datatype
]
END [name_of_package];

包定義或包主體

包主體包含在包規範中宣告的所有公共物件以及私有物件的程式碼。

可以使用 CREATE PACKAGE BODY 語句建立包主體。

包主體的語法:

CREATE [OR REPLACE] PACKAGE BODY name_of_package
IS | AS
[declaration_of_private_variable ...]
[declaration_of_private_constant ...]
BEGIN
[initialization_statement]
[PROCEDURE [Schema..] name_of_procedure
[ (parameter [,parameter]) ]
IS | AS
declaration_of_variables;
declaration_of_constants;
BEGIN
statement(s);
EXCEPTION
WHEN ...
END
]
[FUNCTION [Schema..] name_of_function
[ (parameter [,parameter]) ]
RETURN return_datatype
IS | AS
declaration_of_variables;
declaration_of_constants;
BEGIN
statement(s);
EXCEPTION
WHEN ...
END
]
[EXCEPTION
WHEN built-in_exception_name1 THEN
User defined statement (action) will be taken;
]
END;

示例

讓我們首先建立一個名為 STUDENTS 的表:

CREATE TABLE STUDENTS(
ID INT NOT NULL,
NAME VARCHAR (25) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (30),
FEES DECIMAL (18, 2),
PRIMARY KEY (ID)
);
Table Created

我們現在將插入值:

INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES)
VALUES (1, Tom, 22,'Ohio', 17000 );

INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES)
VALUES (2, Jack, 20, 'Washington', 25000 );

INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES)
VALUES (3, Amy, 25, 'Boston', 30000 );

INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES)
VALUES (4, Anne, 18, 'Texas', 27000 );

現在讓我們將上述值賦給 PL/SQL 變數

DECLARE
s_id students.id%type := 2;
s_name students.name%type;
s_addr students.address%type;
s_fees students.fees%type;
BEGIN
SELECT name, fees INTO s_name, s_fees
FROM students
WHERE id = s_id;
dbms_output.put_line
(‘Student ' ||s_name || ' from ' || s_addr || ' pays ' || s_fees);
END;
/

現在的輸出將是

Student Jack from Washington pays 25000
PL/SQL procedure completed successfully

現在讓我們建立一個包

CREATE OR REPLACE PACKAGE BODY stu_fees AS

PROCEDURE find_fees(s_id students.id%TYPE) IS
s_fees students.fees%TYPE;
BEGIN
SELECT fees INTO s_fees
FROM students
WHERE id = s_id;
dbms_output.put_line('Fees = '|| s_fees);
END find_sal;
END stu_fees;

執行上述程式碼後,將顯示以下結果

Package body created.

包的用途

以下是包的用途

增加的功能

包物件可以被所有正在執行的子程式共享。它們在整個會話中都存在,並允許訪問資料而無需將資料儲存在資料庫中。

模組化

包是模組化的主要示例。它們將所有型別的物件(例如過程、函式、變數、語句)儲存在一個整潔的包中。這使得資訊易於理解和易於閱讀。

更輕鬆的應用程式設計

包分為包規範和定義。這意味著可以隨意進行包的型別宣告,並在需要時在定義中編寫程式碼。

更好的效能

任何子程式第一次需要包時,它將完全載入到記憶體中。對於下一次,該包已可用於其他子程式。

隱藏的實現細節

物件宣告的詳細資訊在包規範中可用,而實現細節則隱藏在包定義中。這使得包更容易處理和使用。

更新於:2020年6月20日

716 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.