Gói trong Oracle là gì?
Gói PL / SQL là một nhóm hợp lý của một chương trình con có liên quan (thủ tục / hàm) thành một phần tử duy nhất. Gói được biên dịch và lưu trữ như một đối tượng cơ sở dữ liệu có thể được sử dụng sau này.
Trong hướng dẫn này, bạn sẽ học-
- Các thành phần của gói
- Đặc điểm kỹ thuật gói
- Gói cơ thể
- Phần tử gói giới thiệu
- Tạo gói trong PL / SQL
- Khai báo chuyển tiếp
- Sử dụng con trỏ trong gói
- Quá tải
- Sự phụ thuộc vào các gói
- Thông tin gói hàng
- UTL FILE - Tổng quan
Các 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
- Gói cơ thể
Đặc điểm kỹ thuật gói
Đặc tả gói bao gồm khai báo tất cả các biến công khai, 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 điểm kỹ thuật Gói.
- Các phần tử được khai báo trong đặc tả 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 phầ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 đượ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 phần tử gói được khởi tạo trong phiên bản đó có giá trị cho đến khi kết thúc phiên.
Cú pháp
CREATE [OR REPLACE] PACKAGEIS … END
Cú pháp trên cho thấy việc tạo đặc tả gói.
Gói cơ thể
Nó bao gồm định nghĩa của tất cả các phần tử 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 và chỉ có thể được gọi từ bên trong gói.
Dưới đây là các đặc điểm của một phần 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 hơn 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 đặc tả được biên dịch. Do đó, nó cần được biên dịch lại mỗi lần sau khi biên dịch các đặc điểm kỹ thuật.
- Các phần tử private nên được xác định trước 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) được 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 một gói được giới thiệu lần đầu tiên trong phiên.
Cú pháp:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- 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 tham chiếu các phần tử gói trong chương trình.
Phần tử gói giới thiệu
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 public của gói cũng có thể được sử dụng theo cách tương tự để gán và lấy 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 tham chiếu / 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 một cơ sở để khởi tạo các phần tử 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 phải là gì 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 phần tử gói. Khối này sẽ được thực thi bất cứ khi nào một gói được giới thiệu lần đầu tiên trong phiên.
Cú pháp
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- Cú pháp trên cho thấy định nghĩa về khởi tạo gói trong thân gói.
Khai báo chuyển tiếp
Khai báo / tham chiếu chuyển tiếp trong gói không có gì khác ngoài việc khai báo các phần tử private một cách riêng biệt và định nghĩa nó trong phần sau của phần thân gói.
Các phần tử private 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 nó khá bất thường khi sử dụng vì trong hầu hết thời gian, các phần tử private được khai báo và định nghĩa trong phần đầu tiên của phần 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 cũng như không sử dụng là tùy thuộc vào yêu cầu của lập trình viên.
Cú pháp:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
Cú pháp trên hiển thị khai báo chuyển tiếp. Các phần tử private đượ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.
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 phải cẩn thận trong việc 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 nội dung 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 giới thiệu nó.
Quá tải
Quá tải là khái niệm có nhiều chương trình con trùng tên. Các chương trình con này sẽ khác nhau bởi 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 lại 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 của mỗi 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 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ị của thông tin của nhân viên trong bảng 'emp'. Hàm get_record sẽ trả về đầu ra kiểu bản ghi cho số nhân viên đã cho và thủ tục set_record sẽ chèn bản ghi kiểu bản ghi vào bảng emp.
Bước 1) Tạo đặc điểm kỹ thuật gói
CREATE OR REPLACE PACKAGE guru99_get_setISPROCEDURE 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 thủ tục và một hàm. Hai phần tử này hiện là phần tử công khai của gói này.
Bước 2) Gói chứa phần thân Gói, nơi định nghĩa thực tế của tất cả các thủ tục và hàm. Trong bước này, Package Body được tạo.
CREATE OR REPLACE PACKAGE BODY guru99_get_setIS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)ISPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERT INTO empVALUES(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%ROWTYPEISl_emp_rec emp%ROWTYPE;BEGINSELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_noRETURN 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 phần 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 cũng giống như 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ó cũng giống như xác định chức năng độc lập.
- Dòng mã 25-26: Định nghĩa 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.
DECLAREl_emp_rec emp%ROWTYPE;l_get_rec emp%ROWTYPE;BEGINdbms 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 1004Control is now executing the package initialization partRecord insertedCalling get function to display the inserted recordEmployee name: CCCEmployee number: 1004Employee salary: 20000Employee 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 trong 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ần gọi gói đầu tiên.
- 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 của nhân viên được chèn.
- Gói được tham chiếu lần thứ hai trong cuộc gọi 'get_record' tới gói. Nhưng phần khởi tạo không được thực thi lần này vì gói đã được khởi tạo trong phiên này.
- Dòng mã 42-45: In chi tiết nhân viên.
Sự phụ thuộc vào các gói
Vì gói là nhóm hợp lý của những thứ liên quan, nó có một số phụ thuộc. Sau đây là những phụ thuộc cần được quan tâm.
- Đặc tả là một đối tượng độc lập.
- Một phần thân gói phụ thuộc vào đặc điểm kỹ thuật.
- Phần thân gói có thể được biên dịch riêng biệt. Bất cứ khi nào đặc tả được biên dịch, phần nội dung cần đượ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ử private chỉ nên được định nghĩa sau khi khai báo phần tử private.
- 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 hàng
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 bảng định nghĩa dữ liệu Oracle.
Bảng dưới đây 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 | Sự miêu tả | Truy vấn |
ALL_OBJECT | Cung cấp các chi tiết của gói như object_id, create_date, last_ddl_time, v.v. Nó 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_OBJECT | Cung cấp các chi tiết của gói như object_id, create_date, last_ddl_time, v.v. Nó sẽ chứa các đối tượng được tạo bởi người dùng hiện tại. | CHỌN * TỪ user_objects trong đó object_name = '
|
ALL_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 where 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 nơi name = '
|
ALL_PROCEDURES | Cung cấp chi tiết chương trình con như object_id, chi tiết quá tải, v.v. được tạo bởi tất cả người dùng. | CHỌN * TỪ all_procedures Trong đó object_name = '
|
USER_PROCEDURES | Cung cấp chi tiết chương trình con như object_id, chi tiết quá tải, v.v. do người dùng hiện tại tạo. | CHỌN * TỪ user_procedures Trong đó object_name = '
|
UTL FILE - Tổng quan
UTL File là gói tiện ích riêng biệt do Oracle cung cấp để thực hiện các tác 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. 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 điều này để ghi các tệp hệ điều hành thuộc bất kỳ loại 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 bài.
Tóm lược
Bây giờ chúng ta đã học các gói trong PL / SQL và bây giờ bạn sẽ có thể làm việc như sau.
- 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 gói
- Xem thông tin gói
- Tệp UTL là gì