Oracle Gói PL/SQL: Loại, Thông số kỹ thuật, Nội dung [Ví dụ]
⚡ Tóm tắt thông minh
Các gói PL/SQL nhóm các thủ tục, hàm, biến, con trỏ và ngoại lệ có liên quan vào một đối tượng lược đồ duy nhất với phần khai báo và phần thân. Phần khai báo định nghĩa giao diện công khai, trong khi phần thân chứa phần triển khai riêng tư, giúp cải thiện tính mô đun và hiệu suất.

Gói trong là gì Oracle?
Oracle PL / SQL gói là một nhóm logicping của liên quan chương trình con (thủ tục/chức năng) được gộp 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 lại sau này.
Thành phần của gói
Một 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 phần mềm bao gồm tuyên bố về tất cả các thông tin công khai. biến, con trỏcác đối tượng, quy trình, chức năng và trường hợp ngoại lệ.
Dưới đây là một vài đặc điểm của thông số kỹ thuật gói sản phẩm.
- 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. Những phần tử như vậy được gọi là các phần tử công khai.
- Phần mô tả gói là một thành phần độ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.
- Mỗi khi một gói được nhắc đến, một thể hiện của gói đó sẽ được tạo ra cho phiên làm việc 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 thể hiện quá trình tạo ra đặc tả gói.
Thân gói
Phần thân của gói bao gồm định nghĩa của tất cả các phần tử có trong phần khai báo gói. Nó cũng có thể chứa định nghĩa của các phần tử không được khai báo trong phần khai báo; các phần tử này được gọi là các 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 bao bì.
- Nó cần chứa định nghĩa cho tất cả các chương trình con/con trỏ đã được khai báo trong tài liệu đặc tả.
- Nó cũng có thể có thêm các chương trình con hoặc các thành phần khác không được khai báo trong đặc tả. Những thành phần này được gọi là các thành phần riêng tư.
- Nó là một đối tượng phụ thuộc, và nó phụ thuộc vào đặc tả gói.
- Trạng thái của phần thân gói sẽ trở thành 'Không hợp lệ' mỗi khi đặc tả được biên dịch. Do đó, cần phải biên dịch lại mỗi lần sau khi biên dịch đặ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 thân gói là phần khai báo toàn cục. Phần này bao gồm các biến, con trỏ và các phần tử riêng tư (khai báo trước) mà toàn bộ gói có thể nhìn thấy.
- Phần cuối cùng của gói là phần khởi tạo gói, được thực thi một lần mỗi khi gói được tham chiếu lần đầu tiên trong phiên làm việc.
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 thể hiện quá trình tạo phần thân của gói.
Bây giờ chúng ta sẽ xem cách tham chiếu đến các phần tử gói trong chương trình.
Giới thiệu các phần tử gói
Sau khi các phần tử được khai báo và định nghĩa 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 tham chiếu 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, ví dụ: ' . '
Các biến công khai của gói cũng có thể được sử dụng theo cùng một cách để gán và lấy 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 hoặc gọi trong một phiên làm việc, một thể hiệ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 chỉ đơn thuần là một khối thực thi được viết trong phần thân gói sau khi đã định nghĩa tất cả các phần tử của gói. Khối này sẽ được thực thi bất cứ khi nào một gói được tham chiếu lần đầu tiên trong phiên làm việc.
Ảnh chụp màn hình bên dưới cho thấy cách khối khởi tạo gói được đặt bên trong phần thân gói khi tạo một gói.
cú pháp
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGIN <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 trước hoặc tham chiếu trong gói thực chất là việc khai báo các phần tử riêng tư một cách riêng biệt và định nghĩa chúng ở 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 chúng đã được khai báo trong phần thân gói. Vì lý do này, khai báo trước được sử dụng. Tuy nhiên, việc sử dụng phương pháp này khá hiếm gặp, bởi vì hầu hết các phần tử riêng tư đều đượ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 OracleViệc sử dụng nó không bắt buộc, và việc sử dụng hay không tùy thuộc vào yêu cầu của lập trình viên.
Ảnh chụp màn hình bên dưới cho thấy cách một phần tử riêng tư được khai báo trước và sau đó được định nghĩa trong phần thân của gói.
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ác với các thành phần khác, cần phải cẩn thận khi sử dụng con trỏ bên trong gói.
Nếu con trỏ được định nghĩa trong phần khai báo gói hoặc trong phần toàn cục của thân gói, thì con trỏ, sau khi được mở, sẽ tồn tại cho đến khi kết thúc phiên làm việc.
Vì vậy, người ta luôn nên sử dụng thuộc tính con trỏ '%ISOPEN' để kiểm tra trạng thái của con trỏ trước khi tham chiếu đến nó.
Quá tải
Nạp chồng (Overloading) là khái niệm về việc có nhiều chương trình con cùng tên. Các chương trình con này khác nhau ở số lượng tham số, kiểu dữ liệu của tham số hoặc kiểu trả về. Nói cách khác, các chương trình con có cùng tên nhưng khác nhau về số lượng tham số, kiểu dữ liệu hoặc kiểu trả về được coi là nạp chồng.
Điều này 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 mỗi chương trình con lại khác nhau. Trong trường hợp này, tên chương trình con được giữ nguyên cho tất cả, còn các tham 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à thiết lập các giá trị thông tin của nhân viên trong bảng 'emp'. Hàm get_record sẽ trả về kiểu bản ghi cho số nhân viên đã cho, và thủ tục set_record sẽ chèn kiểu bản ghi đó vào bảng emp.
Bước 1) Tạo thông số kỹ thuật gói sản phẩm
Ảnh chụp màn hình bên dưới cho thấy thông số kỹ thuật của gói guru99_get_set đang được tạo. Oracle.
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
Code Giải thích
- Code dòng 1-5: Tạo đặc tả gói cho guru99_get_set với một thủ tục và một hàm. Hai thành phần này hiện là các phần tử công khai của gói này.
Bước 2) Gói này 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, phần thân gói được tạo ra.
Ảnh chụp màn hình bên dưới hiển thị định nghĩa phần thân gói guru99_get_set trong Oracle.
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; BEGIN dbms_output.put_line('Control is now executing the package initialization part'); END guru99_get_set; /
Đầu ra:
Package body created
Code Giải thích
- Code dòng 7: Tạo phần thân gói.
- Code dòng 9-16: Định nghĩa phần tử 'set_record' được khai báo trong phần mô tả. Điều này tương đương với việc định nghĩa một thủ tục độc lập trong PL/SQL.
- Code dòng 17-24: Việc định nghĩa phần tử 'get_record' tương đương với việc định nghĩa một hàm độc lập.
- Code dòng 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 chiếu đến gói đã tạo ở trên.
Ảnh chụp màn hình bên dưới hiển thị khối lệnh ẩn danh gọi gói, cùng với đầu ra của nó. Oracle.
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:=1004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary:=20000; l_emp_rec.manager:='BBB'; guru99_get_set.set_record(l_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:'||l_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
Code Giải thích:
- Code dòng 34-37: Điền dữ liệu cho biến kiểu bản ghi trong một khối ẩn danh để gọi phần tử 'set_record' của gói.
- Code dòng 38: Một lệnh gọi đã được thực hiện đến hàm 'set_record' của gói guru99_get_set. Giờ đây, gói được khởi tạo và sẽ tồn tại cho đến khi kết thúc phiên. Phần khởi tạo gói được thực thi vì đây là lần gọi đầu tiên đến gói, và bản ghi được chèn vào bảng bởi phần tử 'set_record'.
- Code dòng 41: Gọi phần tử 'get_record' để hiển thị thông tin chi tiết của nhân viên đã được thêm vào. Gói được tham chiếu lần thứ hai trong lần gọi này, nhưng phần khởi tạo không được thực thi lại, vì gói đã được khởi tạo trong phiên này.
- Code dòng 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 này là một nhóm logicping Trong số những thứ có liên quan, nó có một số mối phụ thuộc. Sau đây là những mối phụ thuộc cần được lưu ý.
- Bản đặc tả là một đối tượng độc lập.
- Hình dạng bên trong của gói hàng phụ thuộc vào thông số kỹ thuật.
- Phần thân gói có thể được biên dịch riêng biệt. Mỗi khi biên dịch đặc tả, phần thân 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 một phần tử riêng tư chỉ nên được định nghĩa sau khi phần tử riêng tư đó được khai báo.
- Các đối tượng cơ sở dữ liệu được đề cập trong phần mô 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 gói được tạo, thông tin về gói, chẳng hạn như mã 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 bảng từ điển dữ liệu.
Bảng dưới đây cung cấp bảng từ điển dữ liệu và thông tin gói có sẵn trong mỗi bảng.
| Tên bảng | Mô tả Chi tiết | Câu Hỏi |
|---|---|---|
| TẤT CẢ CÁ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. Nó 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 =' ' |
| ĐỐI TƯỢNG NGƯỜI DÙNG | Cung cấp thông tin chi tiết về gói như object_id, creation_date, last_ddl_time, v.v. Nó 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 =' ' |
| 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, chẳng hạn như object_id, chi tiết quá tải, v.v., được tạo bởi tất cả người dùng. | SELECT * FROM all_procedures Where 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. | SELECT * FROM user_procedures Where object_name=' ' |
UTL_FILE – Tổng quan
UTL_FILE là một gói tiện ích riêng biệt được cung cấp bởi Oracle Nó được dùng để thực hiện các tác vụ đặc biệt. Chủ yếu được sử dụng để đọc và ghi các tập tin 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ào và lấy thông tin từ các tập tin. Nó cũng cho phép đọc và ghi trong bộ ký tự gốc.
Lập trình viên có thể sử dụng chức năng này để ghi các tập tin hệ điều hành thuộc bất kỳ loại nào, và tập tin 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 được đề cập tại thời điểm ghi.





