Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Giới thiệu về câu lệnh FORALL trong cơ sở dữ liệu Oracle

Xử lý dữ liệu hàng loạt bằng câu lệnh FORALL

Tôi biết rằng phần hướng dẫn trước là một bước đột phá từ Loạt bài Thu thập hàng loạt của chúng tôi. Dù gì thì đó cũng là yêu cầu của khán giả và chúng tôi có nghĩa vụ phải hoàn thành nó. Nhưng đừng lo lắng, chúng tôi đã trở lại đúng hướng. Vì vậy, chúng ta hãy xem phần giới thiệu về Xử lý dữ liệu hàng loạt bằng câu lệnh FORALL trong Cơ sở dữ liệu Oracle.

Trong trường hợp nếu bạn không biết tôi đang nói về hướng dẫn nào thì hãy kiểm tra tại đây. Vì vậy, bây giờ chúng ta hãy đến với chủ đề.

Câu lệnh FORALL là gì?

Câu lệnh FORALL giúp xử lý dữ liệu hàng loạt theo cách được tối ưu hóa bằng cách gửi câu lệnh DML hoặc câu lệnh MERGE (nếu bạn đang sử dụng 11g trở lên) theo lô từ công cụ PL / SQL sang công cụ SQL.

Bạn cũng có thể định nghĩa câu lệnh FORALL như một cấu trúc vòng lặp số lượng lớn thực thi câu lệnh DML hoặc câu lệnh MERGE một lần hoặc nhiều lần cùng một lúc.

Thu thập hàng loạt tối ưu hóa truy vấn và tăng hiệu suất bằng cách giảm các công tắc ngữ cảnh. FORALL thực hiện điều tương tự đối với các câu lệnh DML như Chèn, Xóa, Cập nhật hoặc cho câu lệnh MERGE.

Cú pháp của câu lệnh FORALL là gì?

Cú pháp khá đơn giản, hãy cùng xem.

FORALL index IN bound_clauses 
[SAVE EXCEPTION]
DML statement;

Ở đâu:

FORALL là Từ khoá Dành riêng của Oracle.

Chỉ mục là một bộ đếm vòng lặp được xác định hoàn toàn được công cụ PL / SQL khai báo là PLS_INTEGER. Vì nó được định nghĩa ngầm bởi công cụ PL / SQL nên bạn không cần phải định nghĩa nó. Phạm vi của Chỉ mục được giới hạn trong câu lệnh FORALL mà nó được định nghĩa.

Bound_Clauses là các mệnh đề kiểm soát số lần lặp của vòng lặp. Ngoài ra giá trị của chỉ mục cũng phụ thuộc vào nó. Có ba loại mệnh đề ràng buộc trong Oracle PL / SQL mà chúng ta sẽ thảo luận riêng ở phần sau của hướng dẫn này.

TIẾT KIỆM NGOẠI LỆ là một lựa chọn tùy chọn giữ cho câu lệnh FORALL chạy ngay cả khi câu lệnh DML gây ra một ngoại lệ. Các ngoại lệ này được lưu trong một thuộc tính con trỏ có tên là SQL% Bulk_Exceptions.

Thông tin:
Vì SAVE EXCEPTION, câu lệnh FORALL không thoát đột ngột ngay cả khi có một ngoại lệ. Đây là một lợi thế của câu lệnh FORALL so với Vòng lặp FOR.

Tuyên bố DML :Câu lệnh DML có thể là bất kỳ câu lệnh DML nào như CHÈN, CẬP NHẬT hoặc XÓA. Nếu bạn đang sử dụng Oracle 11g trở lên thì bạn cũng có thể sử dụng câu lệnh MERGE với FORALL. Nhưng bạn cần đảm bảo rằng câu lệnh DML của bạn hoặc câu lệnh MERGE phải tham chiếu đến ít nhất một tập hợp trong mệnh đề VALUES hoặc WHERE của nó.

Hơn nữa, không giống như FOR Loop, với câu lệnh FORALL, chúng ta chỉ có thể sử dụng một DML tại một thời điểm. Đây là thiếu sót của FORALL.

FORALL có phải là một vòng lặp giống FOR Loop không?

Không, mặc dù câu lệnh FORALL lặp qua tất cả các hàng của tập hợp nhưng nó không phải là vòng lặp FOR. Nếu bạn đã xem kỹ cú pháp thì bạn phải nhận thấy rằng không giống như ‘FOR Loop’, khối lệnh FORALL không bắt đầu bằng từ khóa LOOP hoặc kết thúc bằng từ khóa END LOOP.

Chúng tôi có thể thực hiện Chèn và Cập nhật DML cùng một lúc bằng FORALL không?

Không, rất tiếc Không giống như FOR Loop với FORALL, chúng ta không thể thực thi nhiều hơn một DML cùng một lúc. Điều này có nghĩa là bạn có thể thực hiện Chèn hoặc Cập nhật tại một thời điểm không phải cả hai cùng nhau. Đó là một thiếu sót của câu lệnh FORALL.

Thuộc tính con trỏ SQL% Bulk_Exceptions là gì?

Thuộc tính con trỏ SQL% Bulk_Exceptions là một tập hợp các bản ghi có hai trường Error_Index và Error_Code. Error_Index lưu trữ số lần lặp lại của câu lệnh FORALL trong quá trình xảy ra ngoại lệ. Mặt khác, Error_Code lưu trữ mã ngoại lệ tương ứng với ngoại lệ đã nêu ra.

Chúng tôi có thể thấy số lượng ngoại lệ đã xảy ra trong quá trình thực thi câu lệnh FORALL không?

Bạn có thể dễ dàng kiểm tra xem có bao nhiêu ngoại lệ đã được đưa ra trong quá trình thực thi câu lệnh FORALL bằng cách sử dụng SQL% BULK_EXCEPTION.COUNT.

Các mệnh đề ràng buộc đó là gì? Hãy cho chúng tôi biết điều gì đó về họ.

Như đã đề cập ở trên, mệnh đề Bound kiểm soát giá trị của chỉ số vòng lặp và số lần lặp của câu lệnh FORALL. Có ba loại mệnh đề ràng buộc có thể được sử dụng với câu lệnh FORALL trong Cơ sở dữ liệu Oracle. Đây là:

  1. Giới hạn dưới và giới hạn trên
  2. Chỉ số và
  3. Giá trị của

Ràng buộc LOWER AND UPPER :Tương tự như FOR LOOP, trong mệnh đề ràng buộc này, bạn phải chỉ định bắt đầu và kết thúc hợp lệ của các số chỉ mục liên tiếp của tập hợp được tham chiếu.

Cần phải chỉ định một phạm vi hợp lệ của các số chỉ mục liên tiếp cùng với Điều khoản ràng buộc này cho số lượng (các) tập hợp được tham chiếu trong câu lệnh DML. Tuy nhiên, có khả năng xảy ra sai sót nếu bộ sưu tập được tham chiếu với điều khoản này được phát hiện là thưa thớt. Lỗi mà bạn sẽ gặp phải là:

ORA-22160: element at index [3] does not exist

Trong trường hợp bộ sưu tập được tham chiếu của bạn thưa thớt và bạn đang sử dụng Oracle 10g trở lên thì bạn có thể muốn sử dụng hai tùy chọn khác là ‘Chỉ số của’ và ‘Giá trị của’.

CHỈ SỐ CỦA :Mệnh đề ràng buộc thứ hai có sẵn cho chúng tôi là "Chỉ số của". Mệnh đề liên kết này cho phép câu lệnh FORALL của chúng ta lặp qua một tập hợp thưa thớt như một mảng kết hợp hoặc một bảng lồng nhau.

Bài đọc được đề xuất:Giới thiệu về bộ sưu tập PL / SQL

GIÁ TRỊ CỦA :Mệnh đề ràng buộc thứ ba là Giá trị của. Tùy chọn VALUES OF làm rõ ràng rằng giá trị của các phần tử của tập hợp được chỉ định của bộ đếm vòng lặp là cơ sở của các giá trị trong câu lệnh FORALL. Về cơ bản, tập hợp này là một nhóm các chỉ mục mà câu lệnh FORALL có thể lặp qua. Hơn nữa, các chỉ mục này không cần phải là duy nhất cũng như có thể được liệt kê theo thứ tự tùy ý.

Trong trường hợp bạn học nhanh hơn bằng cách xem video hướng dẫn thì đây là một giải thích chi tiết về câu lệnh FORALL.

Chúng ta sẽ học cách sử dụng tất cả các mệnh đề ràng buộc này với câu lệnh FORALL trong các bài hướng dẫn trong tương lai, vì vậy hãy chú ý theo dõi. Để có bản cập nhật mới nhất, bạn có thể đăng ký kênh YouTube của tôi và theo dõi tôi trên phương tiện truyền thông xã hội của tôi.

Cảm ơn và chúc một ngày tốt lành!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GI 12.2 Thay đổi

  2. Khung thực thể và nhiều lược đồ

  3. Máy khách Oracle ORA-12541:TNS:không có người nghe

  4. Gọi thủ tục lưu trữ Oracle từ C #?

  5. PRVG-2027 Chủ sở hữu tệp không nhất quán giữa các nút