Một lần nữa chào mừng bạn trở lại với loạt bài về Phương pháp Thu thập trong Cơ sở dữ liệu Oracle. Cho đến nay trong loạt bài này, chúng ta đã đề cập đến Bộ sưu tập Hàm Count () và Hàm Bộ sưu tập Exist (). Hy vọng bạn thích đọc. Hôm nay trong hướng dẫn PL / SQL này, chúng ta sẽ tìm hiểu các phương thức thu thập First () và Last ().
Phương thức thu thập FIRST () và LAST () là gì?
Chúng tôi sử dụng các hàm thu thập Đầu tiên &Cuối cùng để biết các giá trị chỉ mục đầu tiên và cuối cùng được xác định trong một tập hợp.
Chúng tôi có thể sử dụng các phương pháp thu thập này với bất kỳ loại tập hợp nào không?
Đúng! Bạn có thể sử dụng cả hai hàm này với cả ba loại tập hợp là Mảng liên kết, bảng lồng nhau và các VARRAY.
Khi nào phương thức thu thập FIRST () và LAST () trả về giá trị rỗng?
Cả hai hàm đều trả về null khi được áp dụng cho một tập hợp rỗng hoặc khi áp dụng cho một tập hợp khởi tạo không có phần tử.
Bạn có thể liệt kê đặc tả chức năng cho cả hai chức năng này không?
Đảm bảo! Tại sao không. Đặc tả cho hàm tập hợp FIRST () là:
FUNCTION FIRST RETURN PLS_INTEGER | VARCHAR2
Và đặc tả hàm cho hàm collection LAST () là:
FUNCTION LAST RETURN PLS_INTEGER | VARCHAR2
Thông tin:
Đối với mảng kết hợp được lập chỉ mục chuỗi, các phương thức này trả về chuỗi; “Thấp nhất” và “cao nhất” được xác định theo thứ tự của bộ ký tự được sử dụng trong phiên đó.
Điều gì xảy ra nếu chỉ có 1 phần tử trong VARRAY của tôi?
Trong trường hợp đó, hàm tập hợp FIRST () luôn là 1 và phương thức tập hợp LAST () luôn bằng COUNT.
Điều gì sẽ xảy ra nếu tôi áp dụng các chức năng này cho một bộ sưu tập chưa được khởi tạo?
Ý tôi là nghiêm túc, tại sao bạn lại làm như vậy! Tuy nhiên, nếu bạn áp dụng chức năng thu thập FIRST &LAST cho một tập hợp chưa được khởi tạo thì nó sẽ tạo ra ngoại lệ COLLECTION_IS_NULL.
Ví dụ:Cách sử dụng chức năng thu thập FIRST và LAST với bộ sưu tập?
SET SERVEROUTPUT ON; DECLARE TYPE nt_tab IS TABLE OF NUMBER; col_var nt_tab := nt_tab(10, 20, 30, 40, 50); BEGIN DBMS_OUTPUT.PUT_LINE ('First Index of the Nested table is ' || col_var.FIRST); DBMS_OUTPUT.PUT_LINE ('Last Index of the Nested table is ' || col_var.LAST); END; /
Trong ví dụ trên, chúng ta đã tạo một bảng lồng nhau với tên NT_TAB và khởi tạo nó bằng cách sử dụng biến collection col_var. Bảng lồng nhau này có 5 chỉ mục mà chúng tôi đã lưu trữ các giá trị. Chỉ mục thấp nhất trong bảng lồng nhau này là 1 đang giữ giá trị 10 và chỉ mục lớn nhất là 5 với giá trị 50. Do đó khi thực thi, kết quả từ DBMS_OUTPUT đầu tiên sẽ là 1 và từ câu lệnh DBMS_OUTPUT thứ hai sẽ là 5.
Hãy tiếp tục sao chép mã và tự kiểm tra kết quả.
Điều gì sẽ xảy ra nếu chúng ta xóa phần tử đầu tiên của bảng lồng nhau? Sau đó, kết quả của hàm thu thập FIRST sẽ là gì?
Đó là một câu hỏi rất hay! Nếu bạn xóa phần tử đầu tiên của hàm thu thập thì hàm thu thập FIRST sẽ trả về chỉ số con lớn hơn 1 và đang chứa một số dữ liệu. Hãy xem ví dụ:
SET SERVEROUTPUT ON; DECLARE TYPE nt_tab IS TABLE OF NUMBER; col_var nt_tab := nt_tab(10, 20, 30, 40, 50); BEGIN col_var.DELETE(1); DBMS_OUTPUT.PUT_LINE ('First Index after DELETE is ' || col_var.FIRST); END; /
Trong ví dụ trên, chúng tôi đã xóa phần tử đầu tiên của bảng lồng nhau nt_tab bằng cách sử dụng phương thức thu thập DELETE. Sau khi xóa phần tử đầu tiên là 10 trên chỉ mục 1, chỉ số con thấp nhất mới bây giờ là 2 có một số dữ liệu được lưu trữ trong đó. Do đó khi thực hiện kết quả sẽ là 2.
Điều gì sẽ xảy ra nếu tôi xóa phần tử khỏi giữa bộ sưu tập?
Nếu bạn xóa dữ liệu ở giữa thì hàm thu thập LAST sẽ trả về giá trị lớn hơn giá trị được trả về bởi phương thức COUNT.
Chúng tôi có thể xem dữ liệu được lưu trữ trong các chỉ mục của bộ sưu tập bằng phương pháp thu thập FIRST và LAST không?
Khi tôi đang giải thích khái niệm này trong một lớp học, một học sinh đã giơ tay và hỏi tôi.
Thưa ông, cho đến nay chúng tôi thấy rằng các hàm này trả về số chỉ mục của bộ sưu tập. Điều gì sẽ xảy ra nếu chúng ta muốn xem dữ liệu được lưu trữ trong các chỉ mục đó. Có cách nào để xem dữ liệu được lưu trữ trong chỉ mục bằng cách sử dụng các phương pháp thu thập này ĐẦU TIÊN &CUỐI CÙNG không?
Câu trả lời cho câu hỏi này là, có! Tất nhiên . Cùng với số chỉ số dưới, bạn có thể sử dụng các hàm này để xem dữ liệu được lưu trữ trong chỉ mục thấp nhất và cao nhất của bộ sưu tập.
Ví dụ
SET SERVEROUTPUT ON; DECLARE TYPE nt_tab IS TABLE OF NUMBER; col_var nt_tab := nt_tab(10, 20, 30, 40, 50); BEGIN -- This output statement will return 10 which is the value stored at the first index DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.FIRST)); -- This output statement will return 50 which is the value stored at the last index DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.LAST)); END; /
Để xem dữ liệu được lưu trữ trong chỉ mục đầu tiên và cuối cùng, bạn chỉ cần đặt các lệnh gọi hàm của hàm này bên trong dấu ngoặc đơn của biến bộ sưu tập là col_var giống như chúng ta đã làm trong ví dụ trên.
Bây giờ câu hỏi là điều gì sẽ xảy ra nếu chúng ta TRIM bộ sưu tập? Sau đó, kết quả của hàm sưu tập LAST sẽ là gì? Hãy tiếp tục và xem hướng dẫn bằng video nơi tôi đã giải thích đầu ra của phương thức thu thập CUỐI CÙNG khi bạn cắt bớt bộ sưu tập bằng ví dụ.
Đó là tất cả về các Phương pháp thu thập này. Hy vọng bạn thấy blog này hữu ích. Cảm ơn và chúc một ngày tốt lành!