Oracle Loại bản ghi PL/SQL kèm ví dụ

⚡ Tóm tắt thông minh

Kiểu dữ liệu Record trong PL/SQL là một kiểu dữ liệu phức tạp, nhóm nhiều cột, mỗi cột có tên và kiểu dữ liệu riêng, thành một kiểu dữ liệu mới. Một bản ghi có thể được định nghĩa ở cấp độ cơ sở dữ liệu dưới dạng một đối tượng được lưu trữ hoặc bên trong một chương trình con, và các trường của nó được truy cập bằng toán tử dấu chấm.

  • 🧱 Định nghĩa: Kiểu bản ghi nhóm một hoặc nhiều cột thành một kiểu dữ liệu mới duy nhất.
  • 🔑 Từ khoá: Từ khóa TYPE báo cho trình biên dịch biết rằng một kiểu dữ liệu mới đang được tạo ra.
  • 🏛️ Hai cấp độ: Bản ghi cấp cơ sở dữ liệu là một đối tượng được lưu trữ; bản ghi cấp chương trình con chỉ hiển thị bên trong chương trình con đó.
  • 🔗 Quyền truy cập hiện trường: Các trường được truy cập dưới dạng record_variable.column_name bằng toán tử dấu chấm.
  • 📥 Cấp độ cột: Mỗi lần chỉ có thể gán giá trị cho một trường.
  • 📦 Cấp độ hàng: Câu lệnh SELECT INTO có thể điền toàn bộ dữ liệu vào một bản ghi từ một hàng trong bảng.
  • 🧩 Các loại bản ghi: %ROWTYPE dựa trên bảng, %ROWTYPE dựa trên con trỏ và các bản ghi do lập trình viên định nghĩa.

Oracle Loại bản ghi PL/SQL

Loại bản ghi là gì?

Kiểu bản ghi là một kiểu dữ liệu phức tạp cho phép lập trình viên tạo ra một kiểu dữ liệu mới với cấu trúc cột mong muốn. Các đặc điểm chính của nó là:

  • Nó nhóm một hoặc nhiều cột lại với nhau để tạo thành một kiểu dữ liệu mới.
  • Mỗi cột này đều có tên và kiểu dữ liệu riêng.
  • Một kiểu bản ghi có thể chấp nhận dữ liệu dưới dạng một bản ghi duy nhất bao gồm nhiều cột, hoặc nó có thể chấp nhận giá trị cho một cột cụ thể của bản ghi đó.
  • Kiểu bản ghi đơn giản là một kiểu dữ liệu mới. Sau khi được tạo, nó được lưu trữ dưới dạng một kiểu dữ liệu mới và có thể được sử dụng để khai báo biến trong chương trình.
  • Nó sử dụng từ khóa 'KIỂU' Để hướng dẫn trình biên dịch rằng một kiểu dữ liệu mới đang được tạo ra.
  • Nó có thể được tạo ra tại cấp độ cơ sở dữ liệu, được lưu trữ dưới dạng đối tượng cơ sở dữ liệu và được sử dụng trên toàn bộ cơ sở dữ liệu, hoặc tại cấp độ chương trình conChỉ hiển thị bên trong chương trình con.
  • Kiểu dữ liệu bản ghi ở cấp cơ sở dữ liệu cũng có thể được khai báo cho các cột của bảng, sao cho một cột duy nhất có thể chứa dữ liệu phức tạp.
  • Dữ liệu được truy cập bằng cách tham chiếu đến tên biến, sau đó là toán tử dấu chấm (.), rồi đến tên cột, ví dụ như ''. . '

Cú pháp để khai báo một kiểu bản ghi

Cú pháp khai báo ở cấp độ cơ sở dữ liệu:

Khai báo kiểu bản ghi ở cấp độ cơ sở dữ liệu

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

Trong cú pháp đầu tiên, từ khóa 'CREATE TYPE' hướng dẫn trình biên dịch tạo kiểu bản ghi có tên “type_name_db” với các cột được chỉ định dưới dạng đối tượng cơ sở dữ liệu. Câu lệnh này được đưa ra riêng lẻ, không nằm trong bất kỳ khối nào.

Cú pháp khai báo ở cấp độ chương trình con:

Khai báo kiểu bản ghi ở cấp độ chương trình con

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

Trong cú pháp này, chúng ta chỉ tạo kiểu bản ghi có tên “type_name” bên trong chương trình con. Trong cả hai phương pháp, cách định nghĩa cột và kiểu dữ liệu đều tương tự nhau.

Ví dụ 1: Loại bản ghi dưới dạng đối tượng cơ sở dữ liệu

Trong chương trình này, chúng ta sẽ xem cách tạo một kiểu bản ghi như một đối tượng cơ sở dữ liệu. Chúng ta tạo kiểu bản ghi 'emp_det' với bốn cột. Các cột và kiểu dữ liệu của chúng là:

  • EMP_NO (SỐ)
  • EMP_NAME (VARCHAR2 (150))
  • NGƯỜI QUẢN LÝ (SỐ)
  • LƯƠNG (SỐ LƯỢNG)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Đầu ra:

Type created

Code Giải thích

  • Đoạn mã trên tạo kiểu dữ liệu emp_det như một đối tượng trong cơ sở dữ liệu.
  • Bảng này có 4 cột: emp_no, emp_name, manager và salary, như đã được định nghĩa.
  • Hiện tại 'emp_det' cũng tương tự như bất kỳ biến nào khác. loại dữ liệu (giống như NUMBER hoặc VARCHAR2) và hiển thị trên toàn bộ cơ sở dữ liệu. Do đó, nó có thể được sử dụng ở bất kỳ đâu trong cơ sở dữ liệu để khai báo một biến thuộc loại này.

Ví dụ 2: Truy cập cấp chương trình con, cấp cột

Trong ví dụ này, chúng ta sẽ thấy cách tạo một kiểu bản ghi ở cấp độ chương trình con và cách điền dữ liệu cũng như lấy giá trị từ kiểu bản ghi đó theo cột. Chúng ta tạo kiểu bản ghi 'emp_det' ở cấp độ chương trình con và sử dụng nó để điền và hiển thị dữ liệu.

Ví dụ về truy cập cấp cột của loại bản ghi

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
guru99_emp_rec.emp_no:= 1001;
guru99_emp_rec.emp_name:= 'XXX';
guru99_emp_rec.manager:= 1000;
guru99_emp_rec.salary:= 10000;
dbms_output.put_line('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Đầu ra:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code Giải thích

  • Code dòng 2-8: Kiểu bản ghi 'emp_det' được khai báo với các cột emp_no, emp_name, manager và salary có kiểu dữ liệu NUMBER, VARCHAR2, NUMBER và NUMBER.
  • Code dòng 9: Biến guru99_emp_rec được khai báo là kiểu dữ liệu 'emp_det'. Điều này biến có thể chứa một giá trị bao gồm cả bốn trường.
  • Code dòng 11: Điền vào trường 'emp_no' của 'guru99_emp_rec' với giá trị 1001.
  • Code dòng 12: Điền giá trị XXX vào trường 'emp_name'.
  • Code dòng 13: Điền giá trị 1000 vào trường 'quản lý'.
  • Code dòng 14: Điền giá trị 10000 vào trường 'lương'.
  • Code dòng 15-19: Hiển thị giá trị của 'guru99_emp_rec' trong kết quả đầu ra.

Ví dụ 3: Truy cập cấp chương trình con, cấp hàng

Trong ví dụ này, chúng ta thấy cách tạo một kiểu bản ghi ở cấp chương trình con và điền dữ liệu vào đó ở cấp hàng. Chúng ta tạo kiểu bản ghi 'emp_det' ở cấp chương trình con và sử dụng nó để điền và hiển thị dữ liệu.

Ví dụ về truy cập cấp hàng của kiểu bản ghi

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
COMMIT;
SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002;
dbms_output.put_line ('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Code Giải thích

  • Code dòng 2-8: Kiểu bản ghi 'emp_det' được khai báo với các cột emp_no, emp_name, manager và salary có kiểu dữ liệu NUMBER, VARCHAR2, NUMBER và NUMBER.
  • Code dòng 9: Biến guru99_emp_rec được khai báo là kiểu dữ liệu 'emp_det' và có thể chứa cả bốn trường.
  • Code dòng 11: Điền dữ liệu vào bảng emp với các giá trị 1002 cho emp_no, YYY cho emp_name, 15000 cho salary và 1000 cho manager number.
  • Code dòng 12: Cam kết giao dịch chèn.
  • Code dòng 13: Điền giá trị vào biến 'guru99_emp_rec' ở cấp độ hàng từ truy vấn SELECT cho nhân viên số 1002.
  • Code dòng 15-19: Hiển thị giá trị của 'guru99_emp_rec' trong kết quả đầu ra.

Đầu ra:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

Lưu ý: Kiểu dữ liệu chỉ có thể được truy cập ở cấp độ cột khi chuyển hướng giá trị của nó đến bất kỳ chế độ đầu ra nào. Lưu ý rằng trong ví dụ này, thứ tự danh sách SELECT không khớp với thứ tự trường bản ghi, đó là lý do tại sao giá trị lương và quản lý bị hoán đổi trong kết quả đầu ra.

Các loại bản ghi PL/SQL

Ngoài bản ghi do lập trình viên định nghĩa được hiển thị ở trên, Oracle Cung cấp hai loại bản ghi được neo có khả năng tự động sao chép cấu trúc của chúng. Việc sử dụng chúng giúp tránh việc khai báo lại các cột và giữ cho bản ghi đồng bộ với bảng hoặc con trỏ mà nó dựa trên.

Loại bản ghi Đã khai báo với Cấu trúc xuất phát từ
Bản ghi dựa trên bảng tên_bảng%LOWTYPE Tất cả các cột của một bảng
Bản ghi dựa trên con trỏ cursor_name%ROWTYPE Danh sách lựa chọn của con trỏ
Bản ghi do lập trình viên định nghĩa LOẠI … LÀ BẢN GHI Các cột bạn liệt kê bằng tay

Bản ghi %ROWTYPE là lựa chọn an toàn nhất khi hình dạng cần tuân theo một bảng hoặc một... con trỏVì sự thay đổi cột sẽ được tự động phát hiện trong lần biên dịch tiếp theo.

Câu Hỏi Thường Gặp

Một bản ghi nhóm các cột khác nhau, có thể thuộc các kiểu dữ liệu khác nhau, thành một cấu trúc giống như hàng. Một tập hợp chứa nhiều phần tử cùng kiểu được đánh số thứ tự bằng chỉ số dưới. Chúng thường được kết hợp với nhau, tạo thành một tập hợp các bản ghi.

%ROWTYPE khai báo một bản ghi có các trường khớp với bảng hoặc con trỏ một cách tự động. Hãy sử dụng nó khi bản ghi cần phản ánh nguồn đó, để sự thay đổi cột được phản ánh mà không cần chỉnh sửa khai báo.

Có, nếu cả hai bản ghi đều cùng loại. Câu lệnh SELECT INTO cũng có thể điền toàn bộ một bản ghi từ một hàng trong bảng, miễn là thứ tự trong danh sách chọn khớp với thứ tự các trường của bản ghi.

Đúng vậy. AI có thể đọc định nghĩa bảng và tạo ra khối TYPE … IS RECORD phù hợp, hoặc đề xuất %ROWTYPE khi cần liên kết trực tiếp đến bảng. Hãy xác minh kiểu dữ liệu trước khi sử dụng.

Bản ghi cấp cơ sở dữ liệu được tạo bằng lệnh CREATE TYPE và được lưu trữ dưới dạng một đối tượng hiển thị trên toàn bộ cơ sở dữ liệu. Bản ghi cấp chương trình con được khai báo bên trong một khối lệnh và chỉ tồn tại trong phạm vi chương trình con đó.

Tóm tắt bài viết này với: