Oracle PL/SQL LOOP với ví dụ

Vòng lặp là gì?

Vòng lặp cho phép một phần mã nhất định trong chương trình được thực thi với số lần mong muốn.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu khái niệm vòng lặp trong PL/SQL và luồng điều khiển trong vòng lặp.

Giới thiệu về khái niệm vòng lặp

Khái niệm vòng lặp mang lại lợi ích sau trong mã hóa.

  • Khả năng sử dụng lại mã
  • Giảm kích thước mã
  • Dòng điều khiển dễ dàng
  • Giảm phức tạp

Sơ đồ dưới đây thể hiện khái niệm vòng lặp theo cách hình ảnh

Oracle Vòng lặp PL/SQL

Trong sơ đồ trên, điều kiện vòng lặp sẽ được kiểm tra và miễn là điều kiện vòng lặp được thỏa mãn thì khối thực thi sẽ được thực thi.

Trong mỗi lần lặp, biến bộ đếm vòng lặp thực sự quyết định điều kiện vòng lặp sẽ sửa đổi để khiến điều khiển thoát khỏi vòng lặp. Trong một số trường hợp, biến bộ đếm vòng lặp này là toán tử tăng/giảm cho số đếm được xác định trước và trong một số trường hợp, đó là điều kiện tìm kiếm tiếp tục thực thi khối cho đến khi thỏa mãn.

Tuyên bố kiểm soát vòng lặp

Trước khi tìm hiểu khái niệm vòng lặp, bắt buộc phải tìm hiểu các câu lệnh điều khiển vòng lặp. Các câu lệnh điều khiển vòng lặp là những câu lệnh thực sự điều khiển luồng thực thi bên trong vòng lặp. Dưới đây là mô tả chi tiết về các câu lệnh điều khiển vòng lặp.

TIẾP TỤC

Từ khóa này sẽ gửi một lệnh đến công cụ PL/SQL mà bất cứ khi nào công cụ PL/SQL gặp từ khóa này trong vòng lặp thì nó sẽ bỏ qua mã còn lại trong khối thực thi của mã và lần lặp tiếp theo sẽ bắt đầu ngay lập tức. Điều này sẽ được sử dụng chủ yếu nếu mã bên trong vòng lặp muốn được bỏ qua đối với các giá trị lặp nhất định.

THOÁT / THOÁT KHI NÀO

Từ khóa này sẽ gửi một lệnh đến công cụ PL/SQL mà bất cứ khi nào công cụ PL/SQL gặp từ khóa này thì nó sẽ ngay lập tức thoát khỏi vòng lặp hiện tại. Nếu công cụ PL/SQL gặp EXIT trong một vòng lặp lồng nhau thì nó sẽ thoát ra khỏi vòng lặp mà nó đã được xác định, tức là trong một vòng lặp lồng nhau, việc đưa EXIT vào vòng lặp bên trong sẽ chỉ thoát khỏi điều khiển từ vòng lặp bên trong nhưng không phải từ vòng lặp bên ngoài. 'EXIT WHEN' được theo sau bởi một biểu thức cho kết quả Boolean. Nếu kết quả là TRUE thì điều khiển sẽ EXIT.

GOTO

Câu lệnh này sẽ chuyển quyền điều khiển sang câu lệnh được gắn nhãn (“GOTO ;”). Câu lệnh này có những hạn chế sau

  • Việc chuyển giao quyền điều khiển chỉ có thể được thực hiện trong các chương trình con.
  • Không thể chuyển quyền điều khiển từ phần xử lý ngoại lệ sang phần thực thi

Việc sử dụng câu lệnh này không được khuyến khích trừ khi không có lựa chọn thay thế nào khác, vì việc truy xuất nguồn gốc kiểm soát mã sẽ rất khó khăn trong chương trình do việc chuyển giao quyền kiểm soát từ phần này sang phần khác.

Các loại vòng lặp trong PL/SQL

PL / SQL cung cấp ba loại vòng lặp sau

Tuyên bố vòng lặp cơ bản

Câu lệnh vòng lặp này là cấu trúc vòng lặp đơn giản nhất trong PL/SQL. Khối thực thi bắt đầu bằng từ khóa 'LOOP' và kết thúc bằng từ khóa 'END LOOP'.

Điều kiện thoát phải được đưa ra bên trong khối thực thi này để điều khiển thoát khỏi vòng lặp.

Nó cần từ khóa EXIT được cung cấp rõ ràng trong phần thực thi để thoát khỏi vòng lặp.

Tuyên bố vòng lặp cơ bản

 LOOP
<execution block starts>
<EXIT condition based on developer criteria> 
<execution_block_ends>
END LOOP;

Giải thích cú pháp:

  • Trong cú pháp trên, từ khóa 'LOOP' đánh dấu sự bắt đầu của vòng lặp và 'END LOOP' đánh dấu sự kết thúc của vòng lặp.
  • Khối thực thi chứa tất cả các mã cần được thực thi bao gồm cả điều kiện EXIT.
  • Phần thực thi có thể chứa bất kỳ câu lệnh thực thi nào.

Lưu ý: Câu lệnh vòng lặp cơ bản không có từ khóa EXIT sẽ là INFINITE-LOOP không bao giờ dừng lại.

Ví dụ 1: Trong ví dụ này, chúng ta sẽ in số từ 1 đến 5 bằng cách sử dụng câu lệnh lặp cơ bản. Để thực hiện, chúng ta sẽ thực thi đoạn mã sau.

Tuyên bố vòng lặp cơ bản

DECLARE 
a NUMBER:=1; 
BEGIN
dbms_output.put_line('Program started.');
LOOP
dbms_output.put_line(a);
a:=a+1;
EXIT WHEN a>5;
END LOOP;
dbms_output.put_line('Program completed');
END:
/

Giải thích mã:

  • Dòng mã 2: Khai báo biến 'a' là kiểu dữ liệu 'SỐ' và khởi tạo nó với giá trị '1'.
  • Dòng mã 4: In câu lệnh “Chương trình đã bắt đầu”.
  • Dòng mã 5: Từ khóa 'LOOP' đánh dấu sự bắt đầu của vòng lặp.
  • Dòng mã 6: In giá trị của 'a'.
  • Dòng mã 7: Tăng giá trị của 'a' lên +1.
  • Dòng mã 8: Kiểm tra xem giá trị của 'a' có lớn hơn 5 hay không.
  • Dòng mã 9: Từ khóa 'END LOOP' đánh dấu sự kết thúc của khối thực thi.
  • Mã từ dòng 6 đến dòng 8 sẽ tiếp tục thực thi cho đến khi 'a' đạt giá trị 6, vì điều kiện sẽ trả về TRUE và điều khiển sẽ THOÁT khỏi vòng lặp.
  • Dòng mã 10: In thông báo “Chương trình đã hoàn thành”

Ghi nhãn các vòng lặp

Trong PL/SQL, các vòng lặp có thể được dán nhãn. Nhãn phải được đặt giữa “<<” và “>>”. Việc gắn nhãn các vòng lặp, đặc biệt là trong các mã vòng lặp lồng nhau sẽ giúp dễ đọc hơn. Nhãn có thể được đưa ra trong lệnh EXIT để thoát khỏi vòng lặp cụ thể đó. Bằng cách sử dụng nhãn, điều khiển có thể được thực hiện để thoát trực tiếp vòng lặp bên ngoài của các vòng lặp lồng nhau từ bất kỳ vị trí nào bên trong vòng lặp, bằng cách đưa ra lệnh thoát theo sau là nhãn vòng lặp bên ngoài.

Ghi nhãn các vòng lặp

<<OUTER_LOOP>>
LOOP 
	<execution_block_starts>
	.
	<<INNER_LOOP>>
	LOOP --inner
		<execution_part>
	END LOOP;
	.
	<executi_block_ends>
END LOOP;

Giải thích cú pháp:

  • Trong cú pháp trên, vòng lặp ngoài có thêm một vòng lặp bên trong.
  • '< >' và '< >' là nhãn của các vòng lặp này.

Ví dụ 1: Trong ví dụ này, chúng ta sẽ in số bắt đầu từ 1 bằng cách sử dụng câu lệnh vòng lặp cơ bản. Mỗi số sẽ được in ra nhiều lần bằng giá trị của nó. Giới hạn trên của chuỗi được cố định tại phần khai báo chương trình. Chúng ta hãy tìm hiểu cách chúng ta có thể sử dụng khái niệm nhãn để đạt được điều này. Để thực hiện điều đó, chúng ta sẽ thực thi mã sau

Ghi nhãn các vòng lặpGhi nhãn các vòng lặp

DECLARE
a NUMBER:=0;
b NUMBER;
upper-limit NUMBER :=4;
BEGIN
dbms_output.put_line(‘Program started.' ); 
«outerloop»‭	‬
LOOP 
a:=a+1;
b:=l;
«inner loop»
LOOP
EXIT outer_loop WHEN a > upper_limit;
dbms_output.put_line(a);
b:=b+l;
EXIT inner_loop WHEN b>a;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

Giải thích mã:

  • Dòng mã 2-3: Khai báo biến 'a' và 'b' là kiểu dữ liệu 'SỐ'.
  • Dòng mã 4: Khai báo biến 'upper_limit' là kiểu dữ liệu 'NUMBER' có giá trị '4'
  • Dòng mã 6: In câu lệnh “Chương trình đã bắt đầu”.
  • Dòng mã 7: Vòng lặp bên ngoài đã được gắn nhãn là “outer_loop”
  • Dòng mã 9: Giá trị của 'a' được tăng thêm 1.
  • Dòng mã 11: Vòng lặp bên trong đã được gắn nhãn là “inner_loop”.
  • Dòng mã 13: Điều kiện EXIT kiểm tra xem giá trị 'a' có cao hơn giá trị 'upper_limit' hay không. Nếu không thì nó sẽ đi xa hơn, nếu không nó sẽ trực tiếp thoát ra khỏi vòng lặp bên ngoài.
  • Dòng mã 14: In giá trị của 'b'.
  • Dòng mã 15: Tăng giá trị của 'b' lên +1.
  • Dòng mã 16: Điều kiện EXIT kiểm tra xem giá trị của 'b' có cao hơn 'a' hay không. Nếu vậy thì nó sẽ thoát khỏi điều khiển từ vòng lặp bên trong.
  • Dòng mã 14: In thông báo “Chương trình đã hoàn thành”

Tổng kết

Vòng lặp Vòng lặp cơ bản
Tiêu chí THOÁT Thoát khi gặp từ khóa “EXIT” trong phần thực thi
Sử dụng Tốt để sử dụng khi lối ra không dựa trên bất kỳ điều kiện cụ thể nào.