Oracle PL / SQL Cursor: Implicit, Explicit, Cursor FOR Loop (Ví dụ)

Mục lục:

Anonim

CURSOR trong PL / SQL là gì?

Con trỏ là một con trỏ đến vùng ngữ cảnh này. Oracle tạo vùng ngữ cảnh để xử lý một câu lệnh SQL chứa tất cả thông tin về câu lệnh.

PL / SQL cho phép lập trình viên điều khiển vùng ngữ cảnh thông qua con trỏ. Một con trỏ giữ các hàng được trả về bởi câu lệnh SQL. Tập hợp các hàng mà con trỏ giữ được gọi là tập hợp hoạt động. Các con trỏ này cũng có thể được đặt tên để chúng có thể được tham chiếu từ một vị trí khác của mã.

Trong hướng dẫn này, bạn sẽ học-

  • Con trỏ ngầm
  • Con trỏ rõ ràng
  • Thuộc tính con trỏ
  • Câu lệnh FOR Loop Cursor

Con trỏ có hai loại.

  • Con trỏ ngầm
  • Con trỏ rõ ràng

Con trỏ ngầm

Bất cứ khi nào bất kỳ hoạt động DML nào xảy ra trong cơ sở dữ liệu, một con trỏ ngầm được tạo ra để giữ các hàng bị ảnh hưởng, trong hoạt động cụ thể đó. Các con trỏ này không thể được đặt tên và do đó chúng không thể được điều khiển hoặc tham chiếu từ một nơi khác của mã. Chúng ta chỉ có thể đề cập đến con trỏ gần đây nhất thông qua các thuộc tính của con trỏ.

Con trỏ rõ ràng

Các lập trình viên được phép tạo vùng ngữ cảnh được đặt tên để thực thi các hoạt động DML của họ để có nhiều quyền kiểm soát hơn đối với nó. Con trỏ rõ ràng phải được định nghĩa trong phần khai báo của khối PL / SQL và nó được tạo cho câu lệnh 'SELECT' cần được sử dụng trong mã.

Dưới đây là các bước liên quan đến làm việc với con trỏ rõ ràng.

  • Khai báo con trỏ

    Khai báo con trỏ chỉ có nghĩa là tạo một vùng ngữ cảnh được đặt tên cho câu lệnh 'SELECT' được xác định trong phần khai báo. Tên của vùng ngữ cảnh này giống như tên con trỏ.

  • Mở con trỏ

    Mở con trỏ sẽ chỉ dẫn PL / SQL cấp phát bộ nhớ cho con trỏ này. Nó sẽ làm cho con trỏ sẵn sàng để tìm nạp các bản ghi.

  • Tìm nạp dữ liệu từ con trỏ

    Trong quá trình này, câu lệnh 'SELECT' được thực thi và các hàng được tìm nạp được lưu trữ trong bộ nhớ được cấp phát. Bây giờ chúng được gọi là tập hợp hoạt động. Tìm nạp dữ liệu từ con trỏ là một hoạt động ở mức bản ghi có nghĩa là chúng ta có thể truy cập dữ liệu theo cách từng bản ghi.

    Mỗi câu lệnh tìm nạp sẽ tìm nạp một tập hợp đang hoạt động và giữ thông tin của bản ghi cụ thể đó. Câu lệnh này giống như câu lệnh 'SELECT' tìm nạp bản ghi và gán cho biến trong mệnh đề 'INTO', nhưng nó sẽ không ném ra bất kỳ ngoại lệ nào.

  • Đóng con trỏ

    Khi tất cả bản ghi được tìm nạp ngay bây giờ, chúng ta cần đóng con trỏ để bộ nhớ được cấp cho vùng ngữ cảnh này sẽ được giải phóng.

Cú pháp:

DECLARECURSOR  IS ;BEGINFOR I IN LOOP… END LOOP;END;
  • Trong cú pháp trên, phần khai báo chứa phần khai báo của con trỏ.
  • Con trỏ được tạo cho câu lệnh 'SELECT' được đưa ra trong phần khai báo con trỏ.
  • Trong phần thực thi, con trỏ đã khai báo được thiết lập trong vòng lặp FOR và biến vòng lặp 'I' sẽ hoạt động như biến con trỏ trong trường hợp này.

Ví dụ 1 : Trong ví dụ này, chúng ta sẽ chiếu tất cả tên nhân viên từ bảng emp bằng vòng lặp con trỏ-FOR.

DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/

Đầu ra

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY

Giải thích mã:

  • Dòng mã 2 : Khai báo con trỏ guru99_det cho câu lệnh 'SELECT emp_name FROM emp'.
  • Dòng mã 4 : Xây dựng vòng lặp 'FOR' cho con trỏ với biến vòng lặp lv_emp_name.
  • Dòng mã 5: In tên nhân viên trong mỗi lần lặp của vòng lặp.
  • Dòng mã 8: Thoát khỏi vòng lặp

Lưu ý: Trong vòng lặp Cursor-FOR, không thể sử dụng các thuộc tính con trỏ vì việc mở, tìm nạp và đóng con trỏ được thực hiện ngầm bởi vòng lặp FOR.