Oracle Gói PL/SQL: Loại, Thông số kỹ thuật, Nội dung [Ví dụ]

Gói trong là gì Oracle?

Gói PL/SQL là một nhóm hợp lý các chương trình con liên quan (thủ tục/hàm) thành một phần tử duy nhất. Một gói được biên dịch và lưu trữ dưới dạng đối tượng cơ sở dữ liệu có thể được sử dụng sau này.

Thành phần của gói

Gói PL/SQL có hai thành phần.

  • Đặc điểm kỹ thuật gói
  • Thân gói

Đặc điểm kỹ thuật gói

Đặc tả gói bao gồm một tuyên bố về tất cả các thông tin công khai biến, con trỏ, đối tượng, thủ tục, hàm và ngoại lệ.

Dưới đây là một số đặc điểm của đặc tả Gói.

  • Tất cả các phần tử được khai báo trong đặc tả đều có thể được truy cập từ bên ngoài gói. Các phần tử như vậy được gọi là phần tử công cộng.
  • Đặc tả gói là một phần tử độc lập có nghĩa là nó có thể tồn tại một mình mà không cần thân gói.
  • Bất cứ khi nào một gói đã giới thiệu một phiên bản của gói đó sẽ được tạo cho phiên cụ thể đó.
  • Sau khi phiên bản được tạo cho một phiên, tất cả các thành phần gói được khởi tạo trong phiên bản đó sẽ hợp lệ cho đến khi kết thúc phiên.

cú pháp

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

Cú pháp trên cho thấy việc tạo đặc tả gói.

Thân gói

Nó bao gồm định nghĩa của tất cả các thành phần có trong đặc tả gói. Nó cũng có thể có định nghĩa về các phần tử không được khai báo trong đặc tả, các phần tử này được gọi là phần tử riêng tư và chỉ có thể được gọi từ bên trong gói.

Dưới đây là các đặc điểm của thân gói.

  • Nó phải chứa các định nghĩa cho tất cả các chương trình con/con trỏ đã được khai báo trong đặc tả.
  • Nó cũng có thể có nhiều chương trình con hoặc các phần tử khác không được khai báo trong đặc tả. Chúng được gọi là các yếu tố riêng tư.
  • Nó là một đối tượng đáng tin cậy và nó phụ thuộc vào đặc điểm kỹ thuật của gói.
  • Trạng thái của phần thân gói trở thành 'Không hợp lệ' bất cứ khi nào thông số kỹ thuật được biên dịch. Vì vậy, nó cần phải được biên dịch lại mỗi lần sau khi biên soạn đặc tả.
  • Các phần tử riêng tư phải được xác định trước khi chúng được sử dụng trong phần thân gói.
  • Phần đầu tiên của gói là phần khai báo toàn cục. Điều này bao gồm các biến, con trỏ và các phần tử riêng tư (khai báo chuyển tiếp) hiển thị cho toàn bộ gói.
  • Phần cuối cùng của gói là phần khởi tạo Gói thực thi một lần bất cứ khi nào gói được giới thiệu lần đầu tiên trong phiên.

Cú pháp:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<global_declaration part>
<Private element definition>
<sub_program and public element definition>
.
<Package Initialization> 
END <package_name>
  • Cú pháp trên cho thấy việc tạo phần thân gói.

Bây giờ chúng ta sẽ xem cách giới thiệu các phần tử gói trong chương trình.

Giới thiệu các phần tử gói

Khi các phần tử được khai báo và xác định trong gói, chúng ta cần tham chiếu đến các phần tử để sử dụng chúng.

Tất cả các phần tử công khai của gói có thể được gọi bằng cách gọi tên gói theo sau là tên phần tử được phân tách bằng dấu chấm, tức là ' . '.

Biến công khai của gói cũng có thể được sử dụng theo cách tương tự để gán và tìm nạp các giá trị từ chúng, tức là ' . '.

Tạo gói trong PL/SQL

Trong PL/SQL bất cứ khi nào một gói được gọi/gọi trong một phiên, một phiên bản mới sẽ được tạo cho gói đó.

Oracle cung cấp phương tiện để khởi tạo các thành phần gói hoặc thực hiện bất kỳ hoạt động nào tại thời điểm tạo phiên bản này thông qua 'Khởi tạo gói'.

Đây không gì khác ngoài một khối thực thi được viết trong phần thân gói sau khi xác định tất cả các thành phần gói. Khối này sẽ được thực thi bất cứ khi nào gói được giới thiệu lần đầu tiên trong phiên.

cú pháp

Tạo gói trong PL/SQL

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<Package Initialization> 
END <package_name>
  • Cú pháp trên hiển thị định nghĩa khởi tạo gói trong phần thân gói.

Chuyển tiếp Tuyên bố

Khai báo/tham chiếu chuyển tiếp trong gói chỉ là khai báo các phần tử riêng tư riêng biệt và định nghĩa nó trong phần sau của thân gói.

Các phần tử riêng tư chỉ có thể được tham chiếu nếu nó đã được khai báo trong phần thân gói. Vì lý do này, khai báo chuyển tiếp được sử dụng. Nhưng việc sử dụng nó khá bất thường vì trong hầu hết các trường hợp, các phần tử riêng tư được khai báo và xác định trong phần đầu tiên của thân gói.

Khai báo chuyển tiếp là một tùy chọn được cung cấp bởi Oracle, nó không bắt buộc và việc sử dụng hay không sử dụng là tùy theo yêu cầu của người lập trình.

Chuyển tiếp Tuyên bố

Cú pháp:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element declaration>
.
.
.
<Public element definition that refer the above private element>
.
.
<Private element definition> 
.
BEGIN
<package_initialization code>; 
END <package_name>

Cú pháp trên cho thấy khai báo chuyển tiếp. Các phần tử riêng được khai báo riêng biệt trong phần chuyển tiếp của gói và chúng đã được định nghĩa trong phần sau.

Cách sử dụng con trỏ trong gói

Không giống như các Phần tử khác, người ta cần cẩn thận khi sử dụng con trỏ bên trong gói.

Nếu con trỏ được xác định trong đặc tả gói hoặc trong phần chung của thân gói thì con trỏ sau khi được mở sẽ tồn tại cho đến cuối phiên.

Vì vậy, người ta phải luôn sử dụng thuộc tính con trỏ '% ISOPEN' để xác minh trạng thái của con trỏ trước khi tham chiếu nó.

Quá tải

Quá tải là khái niệm có nhiều chương trình con có cùng tên. Các chương trình con này sẽ khác nhau ở một số tham số hoặc kiểu tham số hoặc kiểu trả về tức là chương trình con có cùng tên nhưng có số lượng tham số khác nhau, kiểu tham số khác nhau hoặc kiểu retype khác nhau được coi là quá tải.

Điều này rất hữu ích khi nhiều chương trình con cần thực hiện cùng một nhiệm vụ, nhưng cách gọi từng chương trình con phải khác nhau. Trong trường hợp này, tên chương trình con sẽ được giữ nguyên cho tất cả và các tham số sẽ được thay đổi theo câu lệnh gọi.

Ví dụ 1: Trong ví dụ này, chúng ta sẽ tạo một gói để lấy và đặt các giá trị thông tin của nhân viên trong bảng 'emp'. Hàm get_record sẽ trả về đầu ra loại bản ghi cho mã số nhân viên đã cho và thủ tục set_record sẽ chèn bản ghi loại bản ghi vào bảng emp.

Bước 1) Tạo đặc tả gói

Quá tải

CREATE OR REPLACE PACKAGE guru99_get_set
IS
PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);
FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;
END guru99_get_set:
/

Đầu ra:

Package created

Giải thích mã

  • Dòng mã 1-5: Tạo đặc tả gói cho guru99_get_set bằng một quy trình và một hàm. Hai cái này hiện là thành phần công khai của gói này.

Bước 2) Gói chứa phần thân Gói, trong đó tất cả các định nghĩa thực tế của thủ tục và hàm sẽ được xác định. Ở bước này, Thân gói được tạo.

Quá tải

CREATE OR REPLACE PACKAGE BODY guru99_get_set
IS	
PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO emp
VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager);
COMMIT;
END set_record;
FUNCTION get_record(p_emp_no IN NUMBER)
RETURN emp%ROWTYPE
IS
l_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no
RETURN l_emp_rec;
END get_record;
BEGUN	
dbms_output.put_line(‘Control is now executing the package initialization part');
END guru99_get_set:
/

Đầu ra:

Package body created

Giải thích mã

  • Dòng mã 7: Tạo thân gói.
  • Dòng mã 9-16: Xác định phần tử 'set_record' được khai báo trong đặc tả. Điều này giống như việc xác định thủ tục độc lập trong PL/SQL.
  • Dòng mã 17-24: Xác định phần tử 'get_record'. Nó giống như việc xác định hàm độc lập.
  • Dòng mã 25-26: Xác định phần khởi tạo gói.

Bước 3) Tạo một khối ẩn danh để chèn và hiển thị các bản ghi bằng cách tham khảo gói đã tạo ở trên.

Quá tải

DECLARE
l_emp_rec emp%ROWTYPE;
l_get_rec emp%ROWTYPE;
BEGIN
dbms output.put line(‘Insert new record for employee 1004');
l_emp_rec.emp_no:=l004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary~20000;
l_emp_rec.manager:=’BBB’;
guru99_get_set.set_record(1_emp_rec);
dbms_output.put_line(‘Record inserted');
dbms output.put line(‘Calling get function to display the inserted record'):
l_get_rec:=guru99_get_set.get_record(1004);
dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name);
dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no);
dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary');
dbms output.put line(‘Employee manager:‘||1_get_rec.manager);		
END:
/

Đầu ra:

Insert new record for employee 1004
Control is now executing the package initialization part
Record inserted
Calling get function to display the inserted record
Employee name: CCC
Employee number: 1004
Employee salary: 20000
Employee manager: BBB

Giải thích mã:

  • Dòng mã 34-37: Điền dữ liệu cho biến loại bản ghi vào một khối ẩn danh để gọi phần tử 'set_record' của gói.
  • Dòng mã 38: Cuộc gọi đã được thực hiện tới 'set_record' của gói guru99_get_set. Bây giờ gói đã được khởi tạo và nó sẽ tồn tại cho đến cuối phiên.
  • Phần khởi tạo gói được thực thi vì đây là lệnh gọi đầu tiên đến gói.
  • Bản ghi được chèn bởi phần tử 'set_record' vào bảng.
  • Dòng mã 41: Gọi phần tử 'get_record' để hiển thị thông tin chi tiết về nhân viên được thêm vào.
  • Gói được giới thiệu lần thứ hai trong lệnh gọi 'get_record' tới gói. Nhưng phần khởi tạo lần này không được thực thi vì gói đã được khởi tạo trong phiên này.
  • Dòng mã 42-45: In thông tin chi tiết của nhân viên.

Sự phụ thuộc vào các gói

Vì gói là nhóm hợp lý các thứ liên quan nên nó có một số phụ thuộc. Sau đây là các phụ thuộc cần được lưu ý.

  • Đặc tả là một đối tượng độc lập.
  • Phần thân gói phụ thuộc vào đặc điểm kỹ thuật.
  • Thân gói có thể được biên dịch riêng. Bất cứ khi nào đặc tả được biên dịch, phần nội dung cần phải được biên dịch lại vì nó sẽ trở nên không hợp lệ.
  • Chương trình con trong phần thân gói phụ thuộc vào phần tử riêng tư chỉ được xác định sau khi khai báo phần tử riêng tư.
  • Các đối tượng cơ sở dữ liệu được tham chiếu trong đặc tả và nội dung cần phải ở trạng thái hợp lệ tại thời điểm biên dịch gói.

Thông tin gói

Sau khi thông tin gói được tạo, thông tin gói như nguồn gói, chi tiết chương trình con và chi tiết quá tải sẽ có sẵn trong Oracle các bảng định nghĩa dữ liệu.

Bảng bên dưới cung cấp bảng định nghĩa dữ liệu và thông tin gói có sẵn trong bảng.

Tên bảng Mô tả Câu Hỏi
TẤT CẢ_ĐỐI TƯỢNG Cung cấp thông tin chi tiết về gói như object_id, creation_date, last_ddl_time, v.v. Gói này sẽ chứa các đối tượng được tạo bởi tất cả người dùng. CHỌN * TỪ all_objects trong đó object_name =' '
USER_ĐỐI TƯỢNG Cung cấp thông tin chi tiết về gói như object_id, creation_date, last_ddl_time, v.v. Gói này sẽ chứa các đối tượng do người dùng hiện tại tạo ra. CHỌN * TỪ user_objects trong đó object_name =' '
TẤT CẢ_SOURCE Cung cấp nguồn của các đối tượng được tạo bởi tất cả người dùng. CHỌN * TỪ all_source trong đó name=' '
USER_SOURCE Cung cấp nguồn của các đối tượng được tạo bởi người dùng hiện tại. CHỌN * TỪ user_source trong đó name=' '
ALL_PROCEDURES Cung cấp thông tin chi tiết về chương trình con như object_id, thông tin chi tiết về quá tải, v.v. được tạo bởi tất cả người dùng. CHỌN * TỪ all_procedures
Ở đâu object_name=' '
NGƯỜI DÙNG_THỦ TỤC Cung cấp thông tin chi tiết về chương trình con như object_id, thông tin chi tiết về quá tải, v.v. do người dùng hiện tại tạo ra. CHỌN * TỪ user_procedures
Ở đâu object_name=' '

TẬP TIN UTL – Tổng quan

Tệp UTL là gói tiện ích riêng biệt được cung cấp bởi Oracle để thực hiện những nhiệm vụ đặc biệt. Điều này chủ yếu được sử dụng để đọc và ghi các tệp hệ điều hành từ các gói hoặc chương trình con PL/SQL. Nó có các chức năng riêng biệt để đưa thông tin và lấy thông tin từ các tập tin. Nó cũng cho phép đọc/ghi trong bộ ký tự gốc.

Lập trình viên có thể sử dụng quyền này để ghi bất kỳ loại tệp hệ điều hành nào và tệp sẽ được ghi trực tiếp vào máy chủ cơ sở dữ liệu. Tên và đường dẫn thư mục sẽ được đề cập tại thời điểm viết.

Tổng kết

Bây giờ chúng ta đã học được các gói trong PL / SQLvà bây giờ bạn có thể làm việc ở mục sau.

  • Các gói PL/SQL và các thành phần của nó
  • Đặc điểm của gói
  • Tham chiếu và nạp chồng các phần tử gói
  • Quản lý sự phụ thuộc trong các gói
  • Xem thông tin gói
  • Tập tin UTL là gì

Bản tin Guru99 hàng ngày

Bắt đầu ngày mới của bạn với những tin tức AI mới nhất và quan trọng nhất hiện nay.