BULK COLLECT giảm chuyển đổi ngữ cảnh giữa SQL và PL / SQL engine và cho phép SQL engine tìm nạp các bản ghi cùng một lúc.
Oracle PL / SQL cung cấp chức năng tìm nạp hàng loạt các bản ghi thay vì tìm nạp từng cái một. BULK COLLECT này có thể được sử dụng trong câu lệnh 'SELECT' để điền hàng loạt các bản ghi hoặc để tìm nạp con trỏ hàng loạt. Vì BULK COLLECT tìm nạp bản ghi trong BULK, mệnh đề INTO phải luôn chứa một biến kiểu tập hợp. Ưu điểm chính của việc sử dụng BULK COLLECT là nó làm tăng hiệu suất bằng cách giảm sự tương tác giữa cơ sở dữ liệu và công cụ PL / SQL.
Cú pháp:
SELECT BULK COLLECT INTO bulk_varaible FROM
;FETCH BULK COLLECT INTO ;
Trong cú pháp trên, BULK COLLECT được sử dụng để thu thập dữ liệu từ câu lệnh 'SELECT' và 'FETCH'.
Trong hướng dẫn này, bạn sẽ học-
Mệnh đề FORALL
Mệnh đề LIMIT
BULK COLLECT thuộc tính
Mệnh đề FORALL
FORALL cho phép thực hiện hàng loạt các hoạt động DML trên dữ liệu. Nó tương tự như câu lệnh vòng lặp FOR ngoại trừ trong vòng lặp FOR, mọi thứ xảy ra ở mức bản ghi trong khi trong FORALL không có khái niệm LOOP. Thay vào đó, toàn bộ dữ liệu có trong phạm vi đã cho được xử lý cùng một lúc.
Cú pháp:
FORALL in… ;
Trong cú pháp trên, thao tác DML đã cho sẽ được thực thi cho toàn bộ dữ liệu có trong phạm vi thấp hơn và cao hơn.
Mệnh đề LIMIT
Khái niệm thu thập hàng loạt tải toàn bộ dữ liệu vào biến thu thập mục tiêu dưới dạng hàng loạt, tức là toàn bộ dữ liệu sẽ được điền vào biến thu thập trong một lần thực hiện. Nhưng điều này không được khuyến khích khi tổng bản ghi cần được tải rất lớn, vì khi PL / SQL cố gắng tải toàn bộ dữ liệu, nó sẽ tiêu tốn nhiều bộ nhớ phiên hơn. Do đó, luôn luôn tốt để hạn chế quy mô của hoạt động thu gom hàng loạt này.
Tuy nhiên, giới hạn kích thước này có thể dễ dàng đạt được bằng cách đưa ra điều kiện ROWNUM trong câu lệnh 'SELECT', trong khi trong trường hợp con trỏ, điều này không thể thực hiện được.
Để khắc phục điều này Oracle đã cung cấp điều khoản 'LIMIT' xác định số lượng bản ghi cần được đưa vào số lượng lớn.
Cú pháp:
FETCH BULK COLLECT INTO LIMIT ;
Trong cú pháp trên, câu lệnh tìm nạp con trỏ sử dụng câu lệnh BULK COLLECT cùng với mệnh đề LIMIT.
BULK COLLECT thuộc tính
Tương tự như thuộc tính con trỏ BULK COLLECT có% BULK_ROWCOUNT (n) trả về số hàng bị ảnh hưởng trong câu lệnh DML thứ n của câu lệnh FORALL, tức là nó sẽ cung cấp số lượng bản ghi bị ảnh hưởng trong câu lệnh FORALL cho mọi giá trị đơn lẻ từ tập hợp Biến đổi. Thuật ngữ 'n' chỉ ra chuỗi giá trị trong bộ sưu tập, mà số lượng hàng là cần thiết.
Ví dụ 1 : Trong ví dụ này, chúng tôi sẽ chiếu tất cả tên nhân viên từ bảng emp bằng cách sử dụng BULK COLLECT và chúng tôi cũng sẽ tăng lương của tất cả nhân viên lên 5000 bằng cách sử dụng FORALL.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);lv_emp_name lv_emp_name_tbl;BEGINOPEN guru99_det;FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;FOR c_emp_name IN lv_emp_name.FIRST… lv_emp_name.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/