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:
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.
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.
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
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
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
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