Trong hướng dẫn này, bạn sẽ học cách khai báo và khởi tạo bộ sưu tập Oracle PL / SQL (Bảng lồng nhau).
Oracle PL / SQL - Các bảng lồng nhau
Các bảng lồng nhau rất giống với các bảng PL / SQL, được gọi trong Oracle là index-by
những cái bàn. Các bảng lồng nhau mở rộng chức năng của index-by
bảng bằng cách thêm các phương thức thu thập bổ sung (được gọi là thuộc tính bảng cho index-by
bảng) và bằng cách thêm khả năng lưu trữ các bảng lồng nhau trong một bảng cơ sở dữ liệu, đó là lý do tại sao chúng được gọi là bảng lồng nhau.
Các bảng lồng nhau cũng có thể được thao tác trực tiếp bằng SQL và có sẵn các ngoại lệ bổ sung được xác định trước.
Ngoài các tính năng bổ sung này, chức năng cơ bản của bảng lồng nhau giống như bảng PL / SQL. Một bảng lồng nhau có thể được coi như một bảng cơ sở dữ liệu với hai cột-khóa và giá trị. Giống như index-tables
, các bảng lồng nhau có thể thưa thớt và các khóa không nhất thiết phải tuần tự.
Khai báo bảng lồng nhau
Cú pháp để tạo kiểu bảng lồng nhau là
TYPE table_name là TABLE OF table_type [KHÔNG ĐẦY ĐỦ];
trong đó table_name là tên của kiểu mới và table_type
là kiểu của mỗi phần tử trong bảng lồng nhau. Table_type
có thể là kiểu dựng sẵn, kiểu đối tượng do người dùng xác định hoặc biểu thức sử dụng %
LOẠI.
Lưu ý
Sự khác biệt về cú pháp duy nhất giữa bảng chỉ mục và bảng lồng nhau là sự hiện diện của mệnh đề INDEX BY BINARY_INTEGER. Nếu mệnh đề này không có, thì kiểu là kiểu bảng lồng nhau. Nếu mệnh đề này có, thì kiểu là kiểu bảng chỉ mục.
Đoạn mã khai báo sau đây hiển thị một số khai báo bảng hợp lệ:
DECLARE - Xác định kiểu bảng dựa trên kiểu đối tượngTYPE t_ClassTab LÀ BẢNG CỦA Classobj; - Một kiểu dựa trên% ROWTYPEType t_StudentsTab IS TABLE của sinh viên% ROWTYPE; - Các biến của kiểu trênv_ClassList t_ClassesTab; v_StudentList t / pre>Oracle PL / SQL - Khởi tạo bảng lồng nhau
Khi một bảng được khai báo như trong khối trước, nó được khởi tạo thành NULL về mặt nguyên tử, giống như một kiểu đối tượng. Nếu bạn cố gắng gán cho một bảng NULL, sẽ xảy ra lỗi " ORA-6531:Tham chiếu đến bộ sưu tập chưa được khởi tạo "tương ứng với ngoại lệ được xác định trước
COLLECTION_IS_NULL
, được nâng lên.Tiếp tục ví dụ trước, phần thực thi sau sẽ phát sinh lỗi này:
BEGIN - Bài tập này sẽ tăng COLLECTION_IS_NULL vì - v_ClassList tự động là null.v_ClassList (1):=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL); END;Vì vậy, làm thế nào để bạn khởi tạo một bảng lồng nhau? Điều này có thể được thực hiện bằng cách sử dụng hàm tạo. Giống như một phương thức khởi tạo kiểu đối tượng, phương thức khởi tạo cho một bảng lồng nhau có tên sam sung là chính kiểu bảng. Tuy nhiên, nó coi như một đối số là một danh sách các phần tử, mỗi phần tử phải có kiểu tương thích với kiểu phần tử của bảng.
Ví dụ sau minh họa việc sử dụng hàm tạo bảng nsat3eed:
DECLARETYPE t_NUmbersTab LÀ BẢNG SỐ; - Tạo bảng có một phần tử.v_Tab1 t_NumbersTab:=t_NumbersTab (-1); - Tạo bảng có năm phần tử.v-Số nguyên tố t_numbersTab:=t_NumbersTab (1, 2, 3, 5, 7); - Thu thập một bảng không có số thứ tự.v_Tab2 t_NumbersTab:=t_NumbersTab (); BEGIN-- Gán cho v_Tab1 (1). Điều này sẽ thay thế giá trị sẵn sàng-- trong v_Tab (1), được bắt đầu thành -1.v_Tab (1):=12345; END;Bảng trống
Lưu ý khai báo của
v_Tab2
trong khối trước:- Tạo bảng không có phần tử.v_Tab2 t_NumbersTab:=t_NumbersTab ();
v_Tab2
được khởi tạo bằng cách gọi hàm tạo không có đối số. Điều này tạo ra một bảng không có phần tử nhưng không phải là NULL về mặt nguyên tử. Khối sau minh họa điều này:DECLARETYPE t_WordsTab LÀ BẢNG CỦA VARCHAR2 (50); - Tạo bảng NULL.v_Tab1 t_WordsTab; - Tạo bảng có một phần tử, chính nó là NULL.v_Tab2 t_WordsTab:=t_WordsTab (); BEGINIF v_Tab1 IS NULL THENDBMS_OUTPUT .PUT_LINE ('v_Tab1 là NULL'); ELSEDBMS_OUTPUT.PUT_LINE ('v_Tab không phải là NULL'); KẾT THÚC IF; NẾU v_Tab2 LÀ NULL THENDBMS_OUTPUT.PUT_LINE ('v_Tab2 là NULL'); ELSEDBMS_OUTPUT.PUT_LINE ('v_Tab2 không phải là NULL_T' ); KẾT THÚC NẾU; HẾT;Nếu chúng tôi chạy khối này, chúng tôi nhận được kết quả sau:
v_Tab1 là NULLv_Tab2 không phải là NULLCác phím lúc khởi tạo
Khi một bảng được khởi tạo bằng hàm tạo, các phần tử của bảng được đánh số theo thứ tự, từ 1 đến số phần tử được chỉ định trong lệnh gọi hàm tạo. Trong quá trình xử lý sau này, các giá trị được lưu trữ tại một số khóa có thể bị xóa (Sử dụng phương pháp DELETE). khi một bảng lồng nhau được chọn từ cơ sở dữ liệu, các khóa sẽ được đánh số lại nếu cần thiết để tuần tự như lúc khởi tạo.