Thứ Tư, 26 tháng 10, 2022

PL/SQL - Vòng lặp (LOOP)

Trong chương này, chúng ta sẽ thảo luận về Vòng lặp trong PL/SQL. Có thể có một tình huống khi bạn cần thực thi một khối mã nhiều lần. Nói chung, các câu lệnh được thực hiện tuần tự: Câu lệnh đầu tiên trong một hàm được thực hiện đầu tiên, tiếp theo là câu lệnh thứ hai, v.v.

Các ngôn ngữ lập trình cung cấp các cấu trúc điều khiển khác nhau cho phép các đường dẫn thực thi phức tạp hơn.

Câu lệnh lặp cho phép chúng ta thực hiện một câu lệnh hoặc một nhóm câu lệnh nhiều lần và sau đây là dạng chung của câu lệnh lặp trong hầu hết các ngôn ngữ lập trình:

Kiến trúc vòng lặp

PL/SQL cung cấp các loại vòng lặp sau để xử lý các yêu cầu lặp. Nhấp vào các liên kết sau để kiểm tra chi tiết của chúng.

STT

Loại vòng lặp & Mô tả

1

PL/SQL cơ bản LOOP

Trong cấu trúc vòng lặp này, chuỗi các câu lệnh được bao giữa các câu lệnh LOOP và END LOOP. Tại mỗi lần lặp, chuỗi các câu lệnh được thực thi và sau đó điều khiển tiếp tục ở đầu vòng lặp.

2

PL/SQL WHILE LOOP

Lặp lại một câu lệnh hoặc một nhóm câu lệnh trong khi một điều kiện đã cho là đúng. Nó kiểm tra điều kiện trước khi thực thi phần thân của vòng lặp.

3

PL/SQL FOR LOOP

Thực thi một chuỗi các câu lệnh nhiều lần và viết tắt đoạn mã quản lý biến vòng lặp.

4

Các vòng lặp lồng nhau trong PL/SQL

Bạn có thể sử dụng một hoặc nhiều vòng lặp bên trong bất kỳ vòng lặp cơ bản nào khác, vòng lặp while hoặc for.

Gắn nhãn PL/SQL Loop

Các vòng lặp PL/SQL có thể được gắn nhãn. Nhãn phải được bao bởi dấu ngoặc kép (<< và >>) và xuất hiện ở đầu câu lệnh LOOP. Tên nhãn cũng có thể xuất hiện ở cuối câu lệnh LOOP. Bạn có thể sử dụng nhãn trong câu lệnh EXIT để thoát khỏi vòng lặp.

Chương trình sau đây minh họa khái niệm -

DECLARE 

   i number(1); 

   j number(1); 

BEGIN 

   << outer_loop >> 

   FOR i IN 1..3 LOOP 

      << inner_loop >> 

      FOR j IN 1..3 LOOP 

         dbms_output.put_line('i is: '|| i || ' and j is: ' || j); 

      END loop inner_loop; 

   END loop outer_loop; 

END; 

/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

i is: 1 and j is: 1 

i is: 1 and j is: 2 

i is: 1 and j is: 3 

i is: 2 and j is: 1 

i is: 2 and j is: 2 

i is: 2 and j is: 3 

i is: 3 and j is: 1 

i is: 3 and j is: 2 

i is: 3 and j is: 3  


PL/SQL procedure successfully completed. 


Các câu lệnh kiểm soát vòng lặp

Các câu lệnh điều khiển vòng lặp thay đổi việc thực thi so với trình tự bình thường của nó. Khi việc thực thi rời khỏi một phạm vi, tất cả các đối tượng tự động được tạo trong phạm vi đó sẽ bị phá hủy.

PL/SQL hỗ trợ các câu lệnh điều khiển sau. Việc gắn nhãn các vòng lặp cũng giúp thực hiện việc kiểm soát bên ngoài một vòng lặp. Nhấp vào các liên kết sau để kiểm tra chi tiết của chúng.

STT

Câu lệnh điều khiển & Mô tả

1

Câu lệnh EXIT

Câu lệnh Exit hoàn thành vòng lặp và điều khiển được chuyển tới câu lệnh ngay sau lệnh END LOOP.

2

Câu lệnh TIẾP TỤC

Làm cho vòng lặp bỏ qua phần còn lại của phần thân và ngay lập tức kiểm tra lại tình trạng của nó trước khi nhắc lại.

3

Câu lệnh GOTO

Chuyển quyền điều khiển sang câu lệnh được gắn nhãn. Mặc dù không nên sử dụng câu lệnh GOTO trong chương trình của bạn

PL / SQL - Câu lệnh vòng lặp cơ bản

Cấu trúc vòng lặp cơ bản bao gồm chuỗi các câu lệnh ở giữa các câu lệnh LOOP và END LOOP . Với mỗi lần lặp, chuỗi các câu lệnh được thực thi và sau đó điều khiển tiếp tục ở đầu vòng lặp.

Cú pháp

Cú pháp của một vòng lặp cơ bản trong ngôn ngữ lập trình PL / SQL là:

LOOP 
   Sequence of statements; 
END LOOP; 

Ở đây, chuỗi (các) câu lệnh có thể là một câu lệnh đơn lẻ hoặc một khối câu lệnh. Câu lệnh EXIT hoặc câu lệnh EXIT WHEN được yêu cầu để phá vỡ vòng lặp.

Thí dụ

DECLARE 
   x number := 10; 
BEGIN 
   LOOP 
      dbms_output.put_line(x); 
      x := x + 10; 
      IF x > 50 THEN 
         exit; 
      END IF; 
   END LOOP; 
   -- after exit, control resumes here  
   dbms_output.put_line('After Exit x is: ' || x); 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

10 
20 
30 
40 
50 
After Exit x is: 60  

PL/SQL procedure successfully completed. 

Bạn có thể sử dụng câu lệnh EXIT WHEN thay cho câu lệnh EXIT -

DECLARE 
   x number := 10; 
BEGIN 
   LOOP 
      dbms_output.put_line(x); 
      x := x + 10; 
      exit WHEN x > 50; 
   END LOOP; 
   -- after exit, control resumes here 
   dbms_output.put_line('After Exit x is: ' || x); 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

10 
20 
30 
40  
50 
After Exit x is: 60  

PL/SQL procedure successfully completed. 

PL / SQL - Câu lệnh WHILE LOOP

Câu lệnh WHILE LOOP trong ngôn ngữ lập trình PL / SQL lặp đi lặp lại thực thi một câu lệnh đích miễn là một điều kiện đã cho là đúng.

Cú pháp

WHILE condition LOOP 
   sequence_of_statements 
END LOOP; 

Thí dụ

DECLARE 
   a number(2) := 10; 
BEGIN 
   WHILE a < 20 LOOP 
      dbms_output.put_line('value of a: ' || a); 
      a := a + 1; 
   END LOOP; 
END; 
/ 

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

value of a: 10 
value of a: 11 
value of a: 12 
value of a: 13 
value of a: 14 
value of a: 15 
value of a: 16 
value of a: 17 
value of a: 18 
value of a: 19  

PL/SQL procedure successfully completed. 

PL / SQL - Câu lệnh FOR LOOP

FOR LOOP là một cấu trúc điều khiển lặp lại cho phép bạn viết một cách hiệu quả một vòng lặp cần thực hiện một số lần cụ thể.

Cú pháp

FOR counter IN initial_value .. final_value LOOP 
   sequence_of_statements; 
END LOOP;

Sau đây là luồng điều khiển trong For Loop -

  • Bước đầu tiên được thực hiện đầu tiên và chỉ một lần. Bước này cho phép bạn khai báo và khởi tạo bất kỳ biến điều khiển vòng lặp nào.

  • Tiếp theo, điều kiện, tức là giá trị ban đầu .. giá trị cuối cùng được đánh giá. Nếu nó là TRUE, phần thân của vòng lặp được thực thi. Nếu nó là FALSE, phần thân của vòng lặp không thực thi và luồng điều khiển sẽ nhảy đến câu lệnh tiếp theo ngay sau vòng lặp for.

  • Sau khi phần thân của vòng lặp for thực thi, giá trị của biến bộ đếm được tăng hoặc giảm.

  • Điều kiện bây giờ được đánh giá một lần nữa. Nếu nó là TRUE, vòng lặp sẽ thực thi và quá trình lặp lại chính nó (phần thân của vòng lặp, sau đó là bước tăng dần và sau đó là điều kiện lặp lại). Sau khi điều kiện trở thành FALSE, FOR-LOOP kết thúc.

Sau đây là một số đặc điểm đặc biệt của PL / SQL cho vòng lặp:

  • Giá trị ban đầu và giá trị cuối cùng của biến vòng lặp hoặc bộ đếm có thể là ký tự, biến hoặc biểu thức nhưng phải đánh giá thành số. Nếu không, PL / SQL tăng ngoại lệ xác định trước VALUE_ERROR.

  • Giá_trị ban đầu không cần là 1; tuy nhiên, số tăng (hoặc giảm) của bộ đếm vòng lặp phải là 1 .

  • PL / SQL cho phép xác định động phạm vi vòng lặp tại thời điểm chạy.

Thí dụ

DECLARE 
   a number(2); 
BEGIN 
   FOR a in 10 .. 20 LOOP 
      dbms_output.put_line('value of a: ' || a); 
  END LOOP; 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

value of a: 10 
value of a: 11 
value of a: 12 
value of a: 13 
value of a: 14 
value of a: 15 
value of a: 16 
value of a: 17 
value of a: 18 
value of a: 19 
value of a: 20  

PL/SQL procedure successfully completed. 

Tuyên bố Đảo ngược FOR LOOP

Theo mặc định, quá trình lặp sẽ tiến hành từ giá trị ban đầu đến giá trị cuối cùng, thường đi lên từ giới hạn thấp hơn đến giới hạn cao hơn. Bạn có thể đảo ngược thứ tự này bằng cách sử dụng từ khóa REVERSE . Trong trường hợp này, quá trình lặp lại tiến hành theo cách khác. Sau mỗi lần lặp, bộ đếm vòng lặp được giảm dần.

Tuy nhiên, bạn phải viết các giới hạn phạm vi theo thứ tự tăng dần (không giảm dần). Chương trình sau đây minh họa điều này -

DECLARE 
   a number(2) ; 
BEGIN 
   FOR a IN REVERSE 10 .. 20 LOOP 
      dbms_output.put_line('value of a: ' || a); 
   END LOOP; 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

value of a: 20 
value of a: 19 
value of a: 18 
value of a: 17 
value of a: 16 
value of a: 15 
value of a: 14 
value of a: 13 
value of a: 12 
value of a: 11 
value of a: 10  

PL/SQL procedure successfully completed. 

PL / SQL - Vòng lặp lồng nhau

PL / SQL cho phép sử dụng một vòng lặp bên trong một vòng lặp khác. Phần sau đây cho thấy một vài ví dụ để minh họa khái niệm.

Cú pháp cho một câu lệnh LOOP cơ bản lồng nhau trong PL / SQL như sau:

LOOP 
   Sequence of statements1 
   LOOP 
      Sequence of statements2 
   END LOOP; 
END LOOP;

Cú pháp cho câu lệnh FOR LOOP lồng nhau trong PL / SQL như sau:

FOR counter1 IN initial_value1 .. final_value1 LOOP 
   sequence_of_statements1 
   FOR counter2 IN initial_value2 .. final_value2 LOOP 
      sequence_of_statements2 
   END LOOP; 
END LOOP;

Cú pháp cho câu lệnh WHILE LOOP lồng nhau trong Pascal như sau:

WHILE condition1 LOOP 
   sequence_of_statements1 
   WHILE condition2 LOOP 
      sequence_of_statements2 
   END LOOP; 
END LOOP; 

Thí dụ

Chương trình sau sử dụng một vòng lặp cơ bản lồng nhau để tìm các số nguyên tố từ 2 đến 100:

DECLARE 
   i number(3); 
   j number(3); 
BEGIN 
   i := 2; 
   LOOP 
      j:= 2; 
      LOOP 
         exit WHEN ((mod(i, j) = 0) or (j = i)); 
         j := j +1; 
      END LOOP; 
   IF (j = i ) THEN 
      dbms_output.put_line(i || ' is prime'); 
   END IF; 
   i := i + 1; 
   exit WHEN i = 50; 
   END LOOP; 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

2 is prime 
3 is prime 
5 is prime 
7 is prime 
11 is prime 
13 is prime 
17 is prime 
19 is prime 
23 is prime 
29 is prime 
31 is prime 
37 is prime 
41 is prime 
43 is prime 
47 is prime  

PL/SQL procedure successfully completed. 

PL / SQL - Câu lệnh EXIT

Câu lệnh EXIT trong ngôn ngữ lập trình PL / SQL có hai cách sử dụng sau:

  • Khi gặp câu lệnh EXIT bên trong vòng lặp, vòng lặp ngay lập tức kết thúc và điều khiển chương trình tiếp tục lại ở câu lệnh tiếp theo sau vòng lặp.

  • Nếu bạn đang sử dụng các vòng lặp lồng nhau (tức là một vòng lặp bên trong một vòng lặp khác), câu lệnh EXIT sẽ dừng việc thực thi vòng lặp trong cùng và bắt đầu thực hiện dòng mã tiếp theo sau khối.

Cú pháp

Cú pháp cho câu lệnh EXIT trong PL / SQL như sau:

EXIT;

Sơ đồ dòng chảy

Câu lệnh thoát PL / SQL

Thí dụ

DECLARE 
   a number(2) := 10; 
BEGIN 
   -- while loop execution  
   WHILE a < 20 LOOP 
      dbms_output.put_line ('value of a: ' || a); 
      a := a + 1; 
      IF a > 15 THEN 
         -- terminate the loop using the exit statement 
         EXIT; 
      END IF; 
   END LOOP; 
END; 
/ 

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

value of a: 10 
value of a: 11 
value of a: 12 
value of a: 13 
value of a: 14 
value of a: 15  

PL/SQL procedure successfully completed.

Tuyên bố EXIT WHEN

Câu lệnh EXIT-WHEN cho phép đánh giá điều kiện trong mệnh đề WHEN. Nếu điều kiện là đúng, vòng lặp hoàn thành và điều khiển được chuyển đến câu lệnh ngay sau END LOOP.

Sau đây là hai khía cạnh quan trọng đối với câu lệnh EXIT WHEN -

  • Cho đến khi điều kiện là đúng, câu lệnh EXIT-WHEN hoạt động giống như câu lệnh NULL, ngoại trừ việc đánh giá điều kiện và không kết thúc vòng lặp.

  • Một câu lệnh bên trong vòng lặp phải thay đổi giá trị của điều kiện.

Cú pháp

Cú pháp cho câu lệnh EXIT WHEN trong PL / SQL như sau:

EXIT WHEN condition;

Câu lệnh EXIT WHEN thay thế một câu lệnh điều kiện như if-then được sử dụng với câu lệnh EXIT.

Thí dụ

DECLARE 
   a number(2) := 10; 
BEGIN 
   -- while loop execution  
   WHILE a < 20 LOOP 
      dbms_output.put_line ('value of a: ' || a);  
      a := a + 1; 
      -- terminate the loop using the exit when statement 
   EXIT WHEN a > 15; 
   END LOOP; 
END;   
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

value of a: 10 
value of a: 11 
value of a: 12 
value of a: 13 
value of a: 14 
value of a: 15  

PL/SQL procedure successfully completed.   

PL / SQL - Câu lệnh CONTINUE

Câu lệnh CONTINUE khiến vòng lặp bỏ qua phần còn lại của phần nội dung của nó và ngay lập tức kiểm tra lại điều kiện của nó trước khi nhắc lại. Nói cách khác, nó buộc lặp lại tiếp theo của vòng lặp, bỏ qua bất kỳ mã nào ở giữa.

Cú pháp

Cú pháp cho câu lệnh CONTINUE như sau:

CONTINUE;

Sơ đồ dòng chảy

Câu lệnh tiếp tục PL / SQL

Thí dụ

DECLARE 
   a number(2) := 10; 
BEGIN 
   -- while loop execution  
   WHILE a < 20 LOOP 
      dbms_output.put_line ('value of a: ' || a); 
      a := a + 1; 
      IF a = 15 THEN 
         -- skip the loop using the CONTINUE statement 
         a := a + 1; 
         CONTINUE; 
      END IF; 
   END LOOP; 
END; 
/ 

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

value of a: 10 
value of a: 11 
value of a: 12 
value of a: 13 
value of a: 14 
value of a: 16 
value of a: 17 
value of a: 18 
value of a: 19  

PL/SQL procedure successfully completed.   

PL / SQL - Tuyên bố GOTO

Một câu lệnh GOTO trong ngôn ngữ lập trình PL / SQL cung cấp một bước nhảy vô điều kiện từ GOTO đến một câu lệnh có nhãn trong cùng một chương trình con.

LƯU Ý - Việc sử dụng câu lệnh GOTO không được khuyến khích trong bất kỳ ngôn ngữ lập trình nào vì nó gây khó khăn cho việc theo dõi luồng điều khiển của một chương trình, khiến chương trình khó hiểu và khó sửa đổi. Bất kỳ chương trình nào sử dụng GOTO đều có thể được viết lại để không cần GOTO.

Cú pháp

Cú pháp cho câu lệnh GOTO trong PL / SQL như sau:

GOTO label;
..
..
<< label >>
statement;

Sơ đồ dòng chảy

Câu lệnh goto PL / SQL

Thí dụ

DECLARE 
   a number(2) := 10; 
BEGIN 
   <<loopstart>> 
   -- while loop execution  
   WHILE a < 20 LOOP
   dbms_output.put_line ('value of a: ' || a); 
      a := a + 1; 
      IF a = 15 THEN 
         a := a + 1; 
         GOTO loopstart; 
      END IF; 
   END LOOP; 
END; 
/

Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

value of a: 10 
value of a: 11 
value of a: 12 
value of a: 13 
value of a: 14 
value of a: 16 
value of a: 17 
value of a: 18 
value of a: 19  

PL/SQL procedure successfully completed.

Các hạn chế với Tuyên bố GOTO

Câu lệnh GOTO trong PL / SQL áp đặt các hạn chế sau:

  • Câu lệnh GOTO không thể phân nhánh thành câu lệnh IF, câu lệnh CASE, câu lệnh LOOP hoặc khối con.

  • Câu lệnh GOTO không thể phân nhánh từ mệnh đề câu lệnh IF này sang mệnh đề khác hoặc từ mệnh đề CASE WHEN này sang mệnh đề khác.

  • Câu lệnh GOTO không thể phân nhánh từ khối bên ngoài vào khối con (tức là khối BEGIN-END bên trong).

  • Câu lệnh GOTO không thể phân nhánh ra khỏi chương trình con. Để kết thúc chương trình con sớm, hãy sử dụng câu lệnh RETURN hoặc đặt nhánh GOTO đến một vị trí ngay trước khi kết thúc chương trình con.

  • Một câu lệnh GOTO không thể phân nhánh từ một trình xử lý ngoại lệ trở lại khối BEGIN-END hiện tại. Tuy nhiên, một câu lệnh GOTO có thể phân nhánh từ một trình xử lý ngoại lệ thành một khối bao quanh.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
PL/SQL, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master