Chương này chỉ cho bạn cách cấu trúc luồng điều khiển thông qua chương trình PL/SQL. Bạn tìm hiểu cách các câu lệnh được kết nối bằng các cấu trúc điều khiển đơn giản nhưng mạnh mẽ có một điểm vào và điểm ra duy nhất. Nói chung, các cấu trúc này có thể xử lý mọi tình huống. Việc sử dụng hợp lý của chúng dẫn đến một chương trình có cấu trúc tốt một cách tự nhiên.
Chủ đề chínhTổng quan
Theo định lý cấu trúc, bất kỳ chương trình máy tính nào cũng có thể được viết bằng các cấu trúc điều khiển cơ bản được chỉ ra trong. Chúng có thể được kết hợp theo bất kỳ cách nào cần thiết để giải quyết một vấn đề nhất định
Hình 3-1 Cấu trúc điều khiển
Cấu trúc lựa chọn kiểm tra một điều kiện, sau đó thực hiện một chuỗi các câu lệnh thay vì một câu lệnh khác, tùy thuộc vào điều kiện đó là đúng hay sai. Điều kiện là bất kỳ biến hoặc biểu thức nào trả về giá trị Boolean [
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;4 hoặc
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;5]. Cấu trúc lặp thực hiện một chuỗi các câu lệnh lặp đi lặp lại miễn là điều kiện còn đúng. Cấu trúc trình tự chỉ đơn giản là thực hiện một chuỗi các câu lệnh theo thứ tự mà chúng xảy ra
Kiểm soát có điều kiện. Câu lệnh IF
Thông thường, cần phải thực hiện các hành động thay thế tùy thuộc vào hoàn cảnh. Câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 cho phép bạn thực hiện một chuỗi các câu lệnh có điều kiện. Tức là dãy có được thực hiện hay không phụ thuộc vào giá trị của một điều kiện. Có ba hình thức của câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6.
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;8,
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;9 và
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;0
NẾU-THÌ
Dạng đơn giản nhất của câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 liên kết một điều kiện với một chuỗi các câu lệnh được bao quanh bởi các từ khóa
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;2 và
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;3
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 [không phải
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;5], như sau
IF condition THEN sequence_of_statements END IF;
Chuỗi các câu lệnh chỉ được thực hiện nếu điều kiện là đúng. Nếu điều kiện là sai hoặc không, câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 không làm gì cả. Trong cả hai trường hợp, điều khiển chuyển sang câu lệnh tiếp theo. Một ví dụ sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;
Bạn có thể muốn đặt các câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 ngắn gọn trên một dòng, như trong
IF x > y THEN high := x; END IF;
NẾU-THÌ-KHÔNG
Dạng thứ hai của câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 thêm từ khóa
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;9 theo sau là một chuỗi các câu lệnh thay thế, như sau
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;
Chuỗi các câu lệnh trong mệnh đề
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;9 chỉ được thực hiện nếu điều kiện là sai hoặc không. Như vậy, mệnh đề
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;9 đảm bảo rằng một chuỗi các câu lệnh được thực thi. Trong ví dụ sau, câu lệnh
BEGIN ... IF sales > 50000 THEN bonus := 1500; ELSIF sales > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO payroll VALUES [emp_id, bonus, ...]; END;2 đầu tiên được thực thi khi điều kiện là đúng, nhưng câu lệnh
BEGIN ... IF sales > 50000 THEN bonus := 1500; ELSIF sales > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO payroll VALUES [emp_id, bonus, ...]; END;2 thứ hai được thực hiện khi điều kiện là sai hoặc không
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;
Mệnh đề
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;2 và
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;9 có thể bao gồm câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6. Nghĩa là, các câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 có thể được lồng vào nhau, như ví dụ sau cho thấy
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;
NẾU-THEN-ELSIF
Đôi khi bạn muốn chọn một hành động từ một số lựa chọn thay thế loại trừ lẫn nhau. Dạng thứ ba của câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 sử dụng từ khóa
BEGIN ... IF sales > 50000 THEN bonus := 1500; ELSIF sales > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO payroll VALUES [emp_id, bonus, ...]; END;9 [không phải
DECLARE ... overdrawn BOOLEAN; BEGIN ... IF new_balance < minimum_balance THEN overdrawn := TRUE; ELSE overdrawn := FALSE; END IF; ... IF overdrawn = TRUE THEN RAISE insufficient_funds; END IF; END;0] để đưa ra các điều kiện bổ sung, như sau
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;
Nếu điều kiện đầu tiên là sai hoặc không, mệnh đề
BEGIN ... IF sales > 50000 THEN bonus := 1500; ELSIF sales > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO payroll VALUES [emp_id, bonus, ...]; END;9 sẽ kiểm tra một điều kiện khác. Một câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 có thể có bất kỳ số lượng
BEGIN ... IF sales > 50000 THEN bonus := 1500; ELSIF sales > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO payroll VALUES [emp_id, bonus, ...]; END;9 mệnh đề nào; . Các điều kiện được đánh giá từng cái một từ trên xuống dưới. Nếu bất kỳ điều kiện nào là đúng, chuỗi câu lệnh liên quan của nó sẽ được thực thi và quyền điều khiển sẽ chuyển sang câu lệnh tiếp theo. Nếu tất cả các điều kiện là sai hoặc không, trình tự trong mệnh đề
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;9 được thực hiện. Xem xét ví dụ sau
BEGIN ... IF sales > 50000 THEN bonus := 1500; ELSIF sales > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO payroll VALUES [emp_id, bonus, ...]; END;
Nếu giá trị của
DECLARE ... overdrawn BOOLEAN; BEGIN ... IF new_balance < minimum_balance THEN overdrawn := TRUE; ELSE overdrawn := FALSE; END IF; ... IF overdrawn = TRUE THEN RAISE insufficient_funds; END IF; END;6 lớn hơn 50000, thì điều kiện thứ nhất và thứ hai là đúng. Tuy nhiên,
DECLARE ... overdrawn BOOLEAN; BEGIN ... IF new_balance < minimum_balance THEN overdrawn := TRUE; ELSE overdrawn := FALSE; END IF; ... IF overdrawn = TRUE THEN RAISE insufficient_funds; END IF; END;7 được gán giá trị thích hợp là 1500 vì điều kiện thứ hai không bao giờ được kiểm tra. Khi điều kiện đầu tiên là đúng, câu lệnh liên quan của nó được thực thi và quyền điều khiển được chuyển đến câu lệnh
DECLARE ... overdrawn BOOLEAN; BEGIN ... IF new_balance < minimum_balance THEN overdrawn := TRUE; ELSE overdrawn := FALSE; END IF; ... IF overdrawn = TRUE THEN RAISE insufficient_funds; END IF; END;8
hướng dẫn
Tránh các câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 vụng về như trong ví dụ sau
DECLARE ... overdrawn BOOLEAN; BEGIN ... IF new_balance < minimum_balance THEN overdrawn := TRUE; ELSE overdrawn := FALSE; END IF; ... IF overdrawn = TRUE THEN RAISE insufficient_funds; END IF; END;
Mã này bỏ qua hai sự thật hữu ích. Đầu tiên, giá trị của một biểu thức Boolean có thể được gán trực tiếp cho một biến Boolean. Vì vậy, bạn có thể thay thế câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 đầu tiên bằng một phép gán đơn giản, như sau
overdrawn := new_balance < minimum_balance;
Thứ hai, một biến Boolean tự nó là đúng hoặc sai. Vì vậy, bạn có thể đơn giản hóa điều kiện trong câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 thứ hai, như sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;0
Khi có thể, hãy sử dụng mệnh đề
BEGIN ... IF sales > 50000 THEN bonus := 1500; ELSIF sales > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO payroll VALUES [emp_id, bonus, ...]; END;9 thay vì các câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 lồng nhau. Bằng cách đó, mã của bạn sẽ dễ đọc và dễ hiểu hơn. So sánh các câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 sau đây
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;1
Các câu lệnh này tương đương về mặt logic, nhưng câu lệnh đầu tiên che khuất dòng logic, trong khi câu lệnh thứ hai tiết lộ nó
Kiểm soát lặp đi lặp lại. Câu lệnh LOOP và EXIT
overdrawn := new_balance < minimum_balance;5 câu lệnh cho phép bạn thực hiện một chuỗi các câu lệnh nhiều lần. Có ba hình thức của câu lệnh
overdrawn := new_balance < minimum_balance;5.
overdrawn := new_balance < minimum_balance;5,
overdrawn := new_balance < minimum_balance;8 và
overdrawn := new_balance < minimum_balance;9
VÒNG
Dạng đơn giản nhất của câu lệnh
overdrawn := new_balance < minimum_balance;5 là vòng lặp cơ bản [hoặc vô hạn], bao gồm một chuỗi các câu lệnh giữa các từ khóa
overdrawn := new_balance < minimum_balance;5 và
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;3
overdrawn := new_balance < minimum_balance;5, như sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;2
Với mỗi lần lặp lại của vòng lặp, chuỗi các câu lệnh được thực thi, sau đó điều khiển sẽ tiếp tục ở đầu vòng lặp. Nếu việc xử lý tiếp theo là không mong muốn hoặc không thể, bạn có thể sử dụng câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 để hoàn thành vòng lặp. Bạn có thể đặt một hoặc nhiều câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 ở bất kỳ đâu bên trong vòng lặp, nhưng không ở bên ngoài vòng lặp. Có hai dạng câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04.
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 và
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;08
LỐI RA
Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 buộc một vòng lặp hoàn thành vô điều kiện. Khi gặp câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04, vòng lặp hoàn thành ngay lập tức và quyền điều khiển chuyển sang câu lệnh tiếp theo. Một ví dụ sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;3
Ví dụ tiếp theo cho thấy bạn không thể sử dụng câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 để hoàn thành một khối PL/SQL
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;4
Hãy nhớ rằng, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 phải được đặt bên trong một vòng lặp. Để hoàn thành khối PL/SQL trước khi kết thúc thông thường, bạn có thể sử dụng câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;13. Để biết thêm thông tin, xem
THOÁT-KHI
Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;08 cho phép một vòng lặp hoàn thành có điều kiện. Khi gặp câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04, điều kiện trong mệnh đề
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;16 được đánh giá. Nếu điều kiện là đúng, vòng lặp hoàn thành và điều khiển chuyển sang câu lệnh tiếp theo sau vòng lặp. Một ví dụ sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;5
Cho đến khi điều kiện là đúng, vòng lặp không thể hoàn thành. Vì vậy, 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. Trong ví dụ trước, nếu câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;17 trả về một hàng, thì điều kiện là sai. Khi câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;17 không trả về một hàng, điều kiện là đúng, vòng lặp hoàn thành và quyền điều khiển được chuyển tới câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;19
Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;08 thay thế một câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 đơn giản. Ví dụ, so sánh các tuyên bố sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;6
Những câu lệnh này tương đương về mặt logic, nhưng câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;08 dễ đọc và dễ hiểu hơn
Nhãn vòng lặp
Giống như các khối PL/SQL, các vòng lặp có thể được gắn nhãn. Nhãn, một mã định danh không khai báo được đặt trong dấu ngoặc nhọn kép, phải xuất hiện ở đầu câu lệnh
overdrawn := new_balance < minimum_balance;5, như sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;7
Theo tùy chọn, tên nhãn cũng có thể xuất hiện ở cuối câu lệnh
overdrawn := new_balance < minimum_balance;5, như ví dụ sau đây cho thấy
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;8
Khi bạn lồng các vòng lặp có nhãn, bạn có thể sử dụng tên nhãn kết thúc để cải thiện khả năng đọc
Với một trong hai dạng câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04, bạn có thể hoàn thành không chỉ vòng lặp hiện tại mà còn bất kỳ vòng lặp kèm theo nào. Chỉ cần dán nhãn vòng lặp kèm theo mà bạn muốn hoàn thành. Sau đó, sử dụng nhãn trong câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04, như sau
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;9
Mọi vòng lặp kèm theo cho đến và bao gồm cả vòng lặp được dán nhãn đều bị thoát
TRONG KHI LẶP LẠI
Câu lệnh
overdrawn := new_balance < minimum_balance;8 liên kết một điều kiện với một chuỗi các câu lệnh được bao quanh bởi các từ khóa
overdrawn := new_balance < minimum_balance;5 và
IF condition1 THEN sequence_of_statements1 ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;3
overdrawn := new_balance < minimum_balance;5, như sau
IF x > y THEN high := x; END IF;0
Trước mỗi lần lặp của vòng lặp, điều kiện được đánh giá. Nếu điều kiện là đúng, chuỗi các câu lệnh được thực thi, sau đó điều khiển sẽ tiếp tục ở đầu vòng lặp. Nếu điều kiện là sai hoặc null, vòng lặp sẽ bị bỏ qua và quyền điều khiển sẽ chuyển sang câu lệnh tiếp theo. Một ví dụ sau
IF x > y THEN high := x; END IF;1
Số lần lặp phụ thuộc vào điều kiện và không xác định cho đến khi hoàn thành vòng lặp. Điều kiện được kiểm tra ở đầu vòng lặp, vì vậy trình tự có thể thực hiện không lần nào. Trong ví dụ trước, nếu giá trị ban đầu của
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;31 lớn hơn 25000, thì điều kiện là sai và vòng lặp bị bỏ qua
Một số ngôn ngữ có cấu trúc
overdrawn := new_balance < minimum_balance;5
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;33 hoặc
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;34
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;33, kiểm tra điều kiện ở cuối vòng lặp thay vì ở trên cùng. Do đó, dãy các câu lệnh được thực hiện ít nhất một lần. PL/SQL không có cấu trúc như vậy, nhưng bạn có thể dễ dàng xây dựng một cấu trúc như sau
IF x > y THEN high := x; END IF;2
Để đảm bảo rằng vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;36 thực hiện ít nhất một lần, hãy sử dụng biến Boolean đã khởi tạo trong điều kiện, như sau
IF x > y THEN high := x; END IF;3
Một câu lệnh bên trong vòng lặp phải gán một giá trị mới cho biến Boolean. Nếu không, bạn có một vòng lặp vô hạn. Ví dụ: các câu lệnh
overdrawn := new_balance < minimum_balance;5 sau đây tương đương về mặt logic
IF x > y THEN high := x; END IF;4
FOR-LOOP
Trong khi số lần lặp qua vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;36 là không xác định cho đến khi vòng lặp hoàn thành, thì số lần lặp qua vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 được biết trước khi vòng lặp được nhập.
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 vòng lặp lặp lại trên một phạm vi số nguyên được chỉ định. [Con trỏ
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 vòng lặp, lặp qua tập kết quả của con trỏ, được thảo luận trong. ] Phạm vi là một phần của sơ đồ lặp, được bao quanh bởi các từ khóa
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 và
overdrawn := new_balance < minimum_balance;5. Dấu chấm kép [
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;44] đóng vai trò là toán tử phạm vi. Cú pháp sau
IF x > y THEN high := x; END IF;5
Phạm vi được đánh giá khi vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 được nhập lần đầu tiên và không bao giờ được đánh giá lại
Như ví dụ tiếp theo cho thấy, chuỗi các câu lệnh được thực hiện một lần cho mỗi số nguyên trong phạm vi. Sau mỗi lần lặp, bộ đếm vòng lặp được tăng lên
IF x > y THEN high := x; END IF;6
Ví dụ sau đây cho thấy rằng nếu giới hạn dưới bằng giới hạn trên, chuỗi các câu lệnh được thực hiện một lần
IF x > y THEN high := x; END IF;7
Theo mặc định, quá trình lặp đi lên từ giới hạn dưới lên giới hạn cao hơn. Tuy nhiên, như ví dụ bên dưới cho thấy, nếu bạn sử dụng từ khóa
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;46, quá trình lặp sẽ tiếp tục đi xuống từ giới hạn trên xuống giới hạn dưới. Sau mỗi lần lặp, bộ đếm vòng lặp giảm đi. Tuy nhiên, bạn viết giới hạn phạm vi theo thứ tự tăng dần [không giảm dần]
IF x > y THEN high := x; END IF;8
Bên trong vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39, bộ đếm vòng lặp có thể được tham chiếu như một hằng số nhưng không thể được gán giá trị, như ví dụ sau đây cho thấy
IF x > y THEN high := x; END IF;9
Sơ đồ lặp
Các giới hạn của phạm vi vòng lặp có thể là chữ, biến hoặc biểu thức nhưng phải đánh giá bằng số. Mặt khác, PL/SQL tăng ngoại lệ được xác định trước
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;48. Giới hạn dưới không nhất thiết phải là 1, như các ví dụ dưới đây cho thấy. Tuy nhiên, số tăng [hoặc giảm] của bộ đếm vòng lặp phải là 1
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;0
Bên trong, PL/SQL gán các giá trị của các giới hạn cho các biến tạm thời
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;49 và, nếu cần, làm tròn các giá trị thành số nguyên gần nhất. Phạm vi cường độ của một
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;49 là -2**31. 2**31. Vì vậy, nếu một giới hạn đánh giá một số nằm ngoài phạm vi đó, bạn sẽ gặp lỗi tràn số khi PL/SQL thử gán, như ví dụ sau đây cho thấy
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;1
Một số ngôn ngữ cung cấp mệnh đề
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;51, cho phép bạn chỉ định một mức tăng khác [ví dụ: 5 thay vì 1]. PL/SQL không có cấu trúc như vậy, nhưng bạn có thể dễ dàng tạo một cấu trúc như vậy. Bên trong vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39, chỉ cần nhân từng tham chiếu đến bộ đếm vòng lặp với số gia mới. Trong ví dụ sau, bạn chỉ định ngày hôm nay cho các thành phần 5, 10 và 15 của bảng chỉ mục
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;2
Phạm vi động
PL/SQL cho phép bạn xác định phạm vi vòng lặp một cách linh hoạt trong thời gian chạy, như ví dụ sau đây cho thấy
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;3
Giá trị của
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;53 không xác định tại thời điểm biên dịch;
Điều gì xảy ra nếu giới hạn dưới của phạm vi vòng lặp ước tính thành một số nguyên lớn hơn giới hạn trên?
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;4
Quy tắc phạm vi
Bộ đếm vòng lặp chỉ được xác định trong vòng lặp. Bạn không thể tham chiếu nó bên ngoài vòng lặp. Sau khi thoát khỏi vòng lặp, bộ đếm vòng lặp không được xác định, như ví dụ sau cho thấy
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;5
Bạn không cần khai báo rõ ràng bộ đếm vòng lặp vì nó được khai báo ngầm dưới dạng một biến cục bộ kiểu
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;55. Ví dụ tiếp theo cho thấy khai báo cục bộ ẩn bất kỳ khai báo toàn cục nào
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;6
Để tham chiếu biến toàn cục trong ví dụ này, bạn phải sử dụng ký hiệu nhãn và dấu chấm, như sau
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;7
Các quy tắc phạm vi tương tự áp dụng cho các vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 lồng nhau. Hãy xem xét ví dụ dưới đây. Cả hai bộ đếm vòng lặp đều có cùng tên. Vì vậy, để tham chiếu bộ đếm vòng lặp bên ngoài từ vòng lặp bên trong, bạn phải sử dụng ký hiệu nhãn và dấu chấm, như sau
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;8
Sử dụng câu lệnh EXIT
Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 cho phép vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 hoàn thành sớm. Ví dụ, vòng lặp sau thường thực hiện mười lần, nhưng ngay khi câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;17 không trả về một hàng, vòng lặp sẽ hoàn thành bất kể nó đã thực hiện bao nhiêu lần
IF condition THEN sequence_of_statements1 ELSE sequence_of_statements2 END IF;9
Giả sử bạn phải thoát khỏi vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 lồng nhau sớm. Bạn có thể hoàn thành không chỉ vòng lặp hiện tại mà bất kỳ vòng lặp kèm theo nào. Chỉ cần dán nhãn vòng lặp kèm theo mà bạn muốn hoàn thành. Sau đó, sử dụng nhãn trong câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;04 để chỉ định vòng lặp
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;39 nào sẽ thoát, như sau
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;0
Điều khiển tuần tự. Câu lệnh GOTO và NULL
Không giống như câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 và
overdrawn := new_balance < minimum_balance;5, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 và
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 không quan trọng đối với lập trình PL/SQL. Cấu trúc của PL/SQL sao cho câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 hiếm khi cần thiết. Đôi khi, nó có thể đơn giản hóa logic đủ để đảm bảo việc sử dụng nó. Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 có thể cải thiện khả năng đọc bằng cách làm rõ ý nghĩa và hành động của câu lệnh điều kiện
Việc lạm dụng các câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 có thể dẫn đến mã phức tạp, không có cấu trúc [đôi khi được gọi là mã spaghetti] khó hiểu và khó bảo trì. Vì vậy, hãy sử dụng ít câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65. Ví dụ: để phân nhánh từ cấu trúc lồng sâu sang quy trình xử lý lỗi, hãy đưa ra một ngoại lệ thay vì sử dụng câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65
Tuyên bố GOTO
Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 rẽ nhánh vô điều kiện. Nhãn phải là duy nhất trong phạm vi của nó và phải đứng trước câu lệnh thực thi hoặc khối PL/SQL. Khi được thực thi, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 chuyển quyền điều khiển sang câu lệnh hoặc khối được gắn nhãn. Trong ví dụ sau, bạn chuyển đến một câu lệnh thực thi ở phía dưới trong một chuỗi các câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;1
Trong ví dụ tiếp theo, bạn chuyển đến một khối PL/SQL xa hơn trong một chuỗi các câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;2
Nhãn
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;74 trong ví dụ sau là bất hợp pháp vì nó không đứng trước câu lệnh thực thi
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;3
Để gỡ lỗi ví dụ cuối cùng, chỉ cần thêm câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66, như sau
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;4
Như ví dụ sau cho thấy, một câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 có thể phân nhánh thành một khối bao quanh từ khối hiện tại
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;5
Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 rẽ nhánh tới khối bao quanh đầu tiên trong đó nhãn được tham chiếu xuất hiện
Những hạn chế
Một số đích đến có thể có của một tuyên bố
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 là bất hợp pháp. Cụ thể, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 không thể phân nhánh thành câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6, câu lệnh
overdrawn := new_balance < minimum_balance;5 hoặc khối con. Ví dụ: câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 sau đây là bất hợp pháp
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;6
Ngoài ra, một câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 không thể rẽ nhánh từ một mệnh đề câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 sang một mệnh đề câu lệnh khác, như ví dụ sau đây cho thấy
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;7
Ví dụ tiếp theo cho thấy rằng một câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 không thể phân nhánh từ một khối bao quanh thành một khối con
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;8
Ngoài ra, một câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 không thể phân nhánh ra khỏi chương trình con, như ví dụ sau cho thấy
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE UPDATE accounts SET balance = balance - debit WHERE ... END IF;9
Cuối cùng, một câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 không thể phân nhánh từ một trình xử lý ngoại lệ vào khối hiện tại. Ví dụ: câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 sau đây là bất hợp pháp
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;0
Tuy nhiên, một câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;65 có thể phân nhánh từ một trình xử lý ngoại lệ thành một khối bao quanh
Tuyên bố NULL
Tuyên bố
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 chỉ định rõ ràng việc không hành động; . Tuy nhiên, nó có thể cải thiện khả năng đọc. Trong cấu trúc cho phép các hành động thay thế, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 đóng vai trò giữ chỗ. Nó cho người đọc biết rằng giải pháp thay thế có liên quan không bị bỏ qua, nhưng thực sự không cần thực hiện hành động nào. Trong ví dụ sau, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 cho biết không có hành động nào được thực hiện đối với các trường hợp ngoại lệ không tên
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;1
Mỗi mệnh đề trong câu lệnh
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;6 phải chứa ít nhất một câu lệnh thực thi được. Câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 có thể thực thi được, vì vậy bạn có thể sử dụng nó trong các mệnh đề tương ứng với các trường hợp không có hành động nào được thực hiện. Trong ví dụ sau, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 nhấn mạnh rằng chỉ những nhân viên được xếp hạng cao nhất mới được thưởng
IF trans_type = 'CR' THEN UPDATE accounts SET balance = balance + credit WHERE ... ELSE IF new_balance >= minimum_balance THEN UPDATE accounts SET balance = balance - debit WHERE ... ELSE RAISE insufficient_funds; END IF; END IF;2
Ngoài ra, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 là một cách thuận tiện để tạo sơ khai khi thiết kế ứng dụng từ trên xuống. Sơ khai là chương trình con giả cho phép bạn trì hoãn định nghĩa của một thủ tục hoặc chức năng cho đến khi bạn kiểm tra và gỡ lỗi chương trình chính. Trong ví dụ sau, câu lệnh
IF sales > quota THEN compute_bonus[empid]; UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id; END IF;66 đáp ứng yêu cầu ít nhất một câu lệnh phải xuất hiện trong phần thực thi của chương trình con