Oracle PL/SQL IF THEN ELSE Câu lệnh: ELSIF, NESTED-IF
Tuyên bố ra quyết định là gì?
Các tuyên bố ra quyết định là những người sẽ quyết định việc kiểm soát luồng của SQL phát biểu dựa trên điều kiện. Nó cung cấp cho người lập trình khả năng kiểm soát tốt hơn trong việc ngăn chặn một mã cụ thể thực thi (sơ đồ 1) hoặc chọn mã mong muốn dựa trên điều kiện (sơ đồ 2). Dưới đây là hình ảnh minh họa của “Tuyên bố ra quyết định”.
Các loại tuyên bố ra quyết định:
Oracle cung cấp các loại tuyên bố ra quyết định sau đây.
- NẾU-THEN
- NẾU-THÌ-KHÁC
- NẾU-THÌ-ELSIF
- NESTED-NẾU
- TRƯỜNG HỢP
- TRƯỜNG HỢP TÌM KIẾM
Câu lệnh NẾU-THÌ
Câu lệnh IF-THEN chủ yếu được sử dụng để thực thi một phần mã cụ thể chỉ khi điều kiện được thỏa mãn.
Điều kiện sẽ mang lại Boolean (Đúng/Sai). Đây là câu lệnh điều kiện cơ bản cho phép ORACLE thực thi/bỏ qua một đoạn mã cụ thể dựa trên các điều kiện được xác định trước.
Cú pháp cho câu lệnh IF THEN:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END if;
- Trong cú pháp trên, từ khóa 'IF' sẽ được theo sau bởi một điều kiện đánh giá là 'TRUE'/'FALSE'.
- Bộ điều khiển sẽ thực hiện chỉ khi điều kiện trả về .
- Trong trường hợp điều kiện đánh giá là sau đó, SQL sẽ bỏ qua , và nó sẽ bắt đầu thực thi mã bên cạnh khối 'END IF'.
Lưu ý: Bất cứ khi nào điều kiện được đánh giá là 'NULL' thì SQL sẽ coi 'NULL' là 'FALSE'.
Ví dụ 1: Trong ví dụ này, chúng ta sẽ in một thông báo khi số lớn hơn 100. Đối với điều đó, chúng ta sẽ thực thi đoạn mã sau
Để in ra thông báo khi một số có giá trị lớn hơn 100, chúng ta thực thi đoạn mã sau.
DECLARE a NUMBER :=10; BEGIN dbms_output.put_line(‘Program started.' ); IF( a > 100 ) THEN dbms_output.put_line('a is greater than 100'); END IF; 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ị '10'.
- Dòng mã 4: In câu lệnh “Chương trình đã bắt đầu”.
- Dòng mã 5: Kiểm tra điều kiện xem biến 'a' có lớn hơn '100 hay không.'
- Dòng mã 6: Nếu 'a' lớn hơn '100' thì "a lớn hơn 100" sẽ được in. Nếu 'a' nhỏ hơn hoặc bằng 100 thì điều kiện không thành công, do đó câu lệnh in ở trên bị bỏ qua.
- Dòng mã 8: In câu lệnh “Chương trình đã hoàn thành”.
Đầu ra mã:
Program started. Program completed.
Ví dụ 2: Trong ví dụ này, chúng tôi sẽ in một thông báo nếu một bảng chữ cái nhất định có trong các nguyên âm tiếng Anh (A, E, I, O, U).
Để in ra một thông báo khi ký tự được chỉ định là Nguyên âm, chúng ta thực thi đoạn mã sau.
DECLARE a CHAR(1) :=’u’; BEGIN IF UPPER(a) in ('A’,'E','I','0','U' ) THEN dbms_output.put_line(‘The character is in English Vowels'); END IF; END; /
Giải thích mã:
- Dòng mã 2: Khai báo biến 'a' là 'CHAR' có kiểu dữ liệu kích thước '1' và khởi tạo nó với giá trị 'u'.
- Dòng mã 4: Kiểm tra điều kiện xem biến 'a' có trong danh sách hay không ('A','E','I','O','U').
- Giá trị của 'a' đã được chuyển đổi thành chữ hoa trước khi so sánh để làm cho phép so sánh không phân biệt chữ hoa chữ thường.
- Dòng mã 5: Nếu 'a' xuất hiện trong danh sách thì câu lệnh “Ký tự nằm trong nguyên âm tiếng Anh” sẽ được in. Nếu điều kiện không thành công thì chương trình này sẽ không đưa ra bất kỳ đầu ra nào, vì bên ngoài khối IF-THEN, chúng ta chưa đưa ra bất kỳ câu lệnh in nào.
Đầu ra mã:
The character is in English Vowels
Câu lệnh NẾU-THÌ-ELSE
- Câu lệnh IF-THEN-ELSE chủ yếu được sử dụng để chọn giữa hai lựa chọn thay thế dựa trên điều kiện.
- Dưới đây là biểu diễn cú pháp của câu lệnh IF-THEN-ELSE.
Cú pháp cho câu lệnh IF-THEN-ELSE:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_blockl> ELSE -execute if the condition failed (returns FALSE) <action_block2> END if;
- Trong cú pháp trên, từ khóa 'IF' sẽ được theo sau bởi một điều kiện đánh giá là 'TRUE'/'FALSE'.
- Bộ điều khiển sẽ thực hiện chỉ khi điều kiện trả về .
- Trong trường hợp điều kiện đánh giá là sau đó, SQL sẽ thực thi .
- Trong mọi trường hợp, một trong hai khối hành động sẽ được thực thi.
Lưu ý: Bất cứ khi nào điều kiện được đánh giá là 'NULL' thì SQL sẽ coi 'NULL' là 'FALSE'.
Ví dụ 1: Trong ví dụ này, chúng ta sẽ in thông báo xem số đã cho là số lẻ hay số chẵn.
DECLARE a NUMBER:=11; BEGIN dbms_output.put_line (‘Program started'); IF( mod(a,2)=0) THEN dbms_output.put_line('a is even number' ); ELSE dbms_output.put_line('a is odd number1); END IF; 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ị '11'.
- Dòng mã 4: In câu lệnh “Chương trình đã bắt đầu”.
- Dòng mã 5: Kiểm tra điều kiện, mô đun của biến 'a' theo '2' có bằng 0 hay không.
- Dòng mã 6: Nếu là '0' thì sẽ in ra “a là số chẵn”.
- Dòng mã 7: Nếu giá trị mô đun không bằng '0' thì điều kiện trả về , do đó thông báo “a là số lẻ” sẽ được in ra.
- Dòng mã 10: In câu lệnh “Chương trình đã hoàn thành”
Đầu ra mã:
Program started. a is odd number Program completed.
Câu lệnh IF-THEN-ELSIF
- Câu lệnh IF-THEN-ELSIF chủ yếu được sử dụng khi một phương án thay thế nên được chọn từ một tập hợp các phương án thay thế, trong đó mỗi phương án thay thế có các điều kiện riêng cần được thỏa mãn.
- Các điều kiện đầu tiên trả về sẽ được thực thi và các điều kiện còn lại sẽ bị bỏ qua.
- Câu lệnh IF-THEN-ELSIF có thể chứa khối 'ELSE' trong đó. Khối 'ELSE' này sẽ được thực thi nếu không có điều kiện nào được thỏa mãn.
Chú thích: Khối ELSE là tùy chọn trong câu lệnh điều kiện này. Nếu không có khối ELSE và không có điều kiện nào được thỏa mãn thì bộ điều khiển sẽ bỏ qua tất cả khối hành động và bắt đầu thực thi phần còn lại của mã.
Cú pháp cho câu lệnh IF-THEN-ELSIF:
IF <conditionl: returns Boolean> THEN -executed only if the condition returns TRUE < action_blockl> ELSIF <condition2 returns Boolean> < action_block2> ELSIF <condition3:returns Boolean> < action_block3> ELSE —optional <action_block_else> END if;
- Theo cú pháp trên, điều khiển sẽ thực thi chỉ khi điều kiện 1 trả về .
- Nếu điều kiện 1 không được thỏa mãn thì bộ điều khiển sẽ kiểm tra điều kiện 2.
- Bộ điều khiển sẽ thoát khỏi câu lệnh IF trong hai trường hợp sau.
- Khi bộ điều khiển tìm thấy bất kỳ điều kiện nào trả về . Trong trường hợp này, action_block tương ứng sẽ được thực thi và bộ điều khiển sẽ thoát khỏi khối câu lệnh IF này và sẽ bắt đầu thực thi đoạn mã còn lại.
- Khi không có điều kiện nào được thỏa mãn, bộ điều khiển sẽ thực thi khối ELSE nếu có, sau đó sẽ thoát khỏi câu lệnh IF.
Lưu ý: Bất cứ khi nào điều kiện được đánh giá là 'NULL' thì SQL sẽ coi 'NULL' là 'FALSE'.
Ví dụ 1: Không có khối ELSE
Trong ví dụ này, chúng ta sẽ in điểm dựa trên các điểm đã cho mà không có điều kiện nào khác (mark >= 70 Grade A, mark >=40 và mark<70 Grade B, mark >=35 và mark<40 Grade C).
DECLARE mark NUMBER :=55; BEGIN dbms_output.put_line(‘Program started.’ ); IF( mark >= 70) THEN dbms_output.put_line(‘Grade A’); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line(‘Grade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line(‘Grade C’); END IF; dbms_output.put_line(‘Program completed.’); END; /
Giải thích mã:
- Dòng mã 2: Khai báo biến 'mark' là kiểu dữ liệu 'NUMBER' và khởi tạo nó với giá trị '55'.
- Dòng mã 4: In câu lệnh “Chương trình đã bắt đầu”.
- Dòng mã 5: Kiểm tra điều kiện1, xem 'mark' lớn hơn hay bằng 70.
- Dòng mã 7: Vì điều kiện 1 không thành công nên điều kiện 2 '70>mark>=40' được chọn.
- Dòng mã 8: Điều kiện2 trả về , do đó thông báo 'Hạng B' sẽ được in.
- Dòng mã 12: In câu lệnh “Chương trình đã hoàn thành”.
- Trong trường hợp này, điều kiện3 'mark < 35' sẽ bị bỏ qua, vì bộ điều khiển đã tìm thấy một điều kiện trả về trước điều kiện 3.
Đầu ra mã:
Program started. Grade B Program completed.
Ví dụ 2: Với khối ELSE
Trong ví dụ này, chúng ta sẽ in điểm dựa trên các điểm đã cho với điều kiện khác (mark >= 70 Grade A, mark >=40 và mark<70 Grade B, mark >=35 và mark<40 Grade C, ngược lại 'Không có điểm').
DECLARE mark NUMBER :=25; BEGIN dbms_output.put_line(‘Program started.’ ); IF( mark >= 70) THEN dbms_output.put_line(‘Grade A’); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line(‘Grade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line(‘Grade C); ELSE dbms_output.put_line(‘No Grade’); END IF; dbms_output.put_line(‘Program completed.' ); END; /
Giải thích mã:
- Dòng mã 2: Khai báo biến 'mark' là kiểu dữ liệu 'NUMBER' và khởi tạo nó với giá trị '25'.
- Dòng mã 4: In câu lệnh “Chương trình đã bắt đầu”.
- Dòng mã 5: Kiểm tra điều kiện 1, xem 'mark' lớn hơn hay bằng 70.
- Dòng mã 7: Vì điều kiện 1 không thành công nên điều kiện 2 '70>mark>=40' được chọn.
- Dòng mã 8: Vì điều kiện 2 không thành công nên điều kiện 3 '40>mark>=35' được chọn.
- Dòng mã 11: Vì tất cả các điều kiện đều không thành công, bộ điều khiển bây giờ sẽ kiểm tra sự hiện diện của khối ELSE và nó sẽ in thông báo 'Không có lớp' từ khối ELSE.
- Dòng mã 14: In câu lệnh “Chương trình đã hoàn thành”.
Đầu ra mã:
Program started. No Grade Program completed.
Câu lệnh NESTED-IF
- Câu lệnh NESTED-IF về cơ bản cho phép người lập trình đặt một hoặc nhiều điều kiện 'IF' bên trong một điều kiện 'IF' khác khác với những câu nói thông thường.
- Mỗi điều kiện 'IF' phải có một câu lệnh 'END IF' riêng biệt đánh dấu phần cuối của phạm vi cụ thể đó .
- Câu lệnh 'IF' sẽ coi câu lệnh 'END IF' gần nhất là điểm cuối cho điều kiện cụ thể đó.
- Biểu diễn bằng hình ảnh cho NESTED-IF được hiển thị bên dưới sơ đồ.
IF <conditionl: returns Boolean> THEN —executed only if the condition returns TRUE <action block1 starts> IF <condition2: returns Boolean> THEN <action_block2> END IF; —END IF corresponds to condition2 <action_blockl ends> END IF; —END IF corresponds to condition1
Giải thích cú pháp:
- Trong cú pháp trên, IF bên ngoài chứa thêm một câu lệnh IF trong khối hành động của nó.
- Điều kiện 1 trả về , thì điều khiển sẽ được thực thi và kiểm tra điều kiện1.
- Nếu điều kiện 2 cũng trả về , sau đó cũng sẽ được thực thi.
- Trong trường hợp điều kiện 2 đánh giá thành sau đó, SQL sẽ bỏ qua .
Ở đây chúng ta sẽ xem một ví dụ về Nested If –
Ví dụ về câu lệnh If lồng nhau: Số lớn nhất trong ba số
Trong ví dụ này, chúng ta sẽ in số lớn nhất trong ba số bằng cách sử dụng câu lệnh Nested-If. Các số sẽ được chỉ định trong phần khai báo, như bạn có thể thấy trong đoạn mã bên dưới, tức là Number= 10,15 và 20 và số tối đa sẽ được tìm nạp bằng cách sử dụng câu lệnh Nested-if.
DECLARE a NUMBER :=10; b NUMBER :=15; c NUMBER :=20; BEGIN dbms_output.put_line(‘Program started.' ); IF( a > b)THEN /*Nested-if l */ dbms_output.put_line(’Checking Nested-IF 1'); IF( a > c ) THEN dbms_output.put_line(‘A is greatest’); ELSE dbms_output.put_line(‘C is greatest’); END IF; ELSE /*Nested-if2 */ dbms_output.put_line('Checking Nested-IF 2' ); IF( b > c ) THEN dbms_output.put_line(’B is greatest' ); ELSE dbms_output.put_line(’C is greatest' ); END IF; END IF; 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ị '10'.
- Dòng mã 3: Khai báo biến 'b' là kiểu dữ liệu 'SỐ' và khởi tạo nó với giá trị '15'.
- Dòng mã 4: Khai báo biến 'c' là kiểu dữ liệu 'SỐ' và khởi tạo nó với giá trị '20'.
- Dòng mã 6: In câu lệnh “Chương trình đã bắt đầu” (dòng 6).
- Dòng mã 7: Kiểm tra điều kiện1, xem 'a' có lớn hơn 'b' hay không (dòng 7).
- Dòng mã 10: Nếu 'a' lớn hơn 'b, thì điều kiện trong 'nested-if 1' sẽ kiểm tra xem 'a' có lớn hơn 'c' hay không (dòng 10).
- Dòng mã 13: Nếu vẫn 'a' lớn hơn thì thông báo 'A lớn nhất' sẽ được in (dòng 11). Ngược lại, nếu điều kiện 2 không thành công thì 'C lớn nhất' sẽ được in (dòng 13).
- Dòng mã 18: Trong trường hợp điều kiện 1 trả về sai, thì điều kiện trong 'nested-if 2' sẽ kiểm tra xem 'b' có lớn hơn 'c'(dòng 18) hay không.
- Dòng mã 21: Nếu 'b' lớn hơn 'c' thì thông báo 'B là lớn nhất' sẽ được in (dòng 19), nếu không, nếu điều kiện 2 không thành công thì 'C là lớn nhất' sẽ được in (dòng 21).
- Dòng mã 24: In câu lệnh “Chương trình đã hoàn thành” (dòng 24).
Đầu ra của mã:
Program started. Checking Nested-IF 2 C is greatest Program completed.
Tổng kết
Trong chương này, chúng ta đã tìm hiểu các tuyên bố ra quyết định khác nhau cũng như cú pháp và ví dụ của chúng. Bảng dưới đây đưa ra bản tóm tắt các câu lệnh điều kiện khác nhau mà chúng ta đã thảo luận.
LOẠI | MÔ TẢ | SỬ DỤNG |
---|---|---|
NẾU-THEN | Kiểm tra điều kiện Boolean, nếu mã TRUE trong khối 'THEN' sẽ được thực thi. | Để bỏ qua/thực thi một mã cụ thể dựa trên điều kiện. |
NẾU-THÌ-KHÁC | Kiểm tra điều kiện Boolean, nếu mã TRUE trong khối 'THEN' sẽ được thực thi, nếu mã sai trong khối 'ELSE' được thực thi. | Thích hợp nhất trong điều kiện 'THIS-OR-THAT'. |
NẾU-THÌ-ELSIF | Kiểm tra điều kiện Boolean theo thứ tự tuần tự. Khối đầu tiên trong chuỗi trả về điều kiện TRUE sẽ được thực thi. Nếu không có điều kiện nào trong chuỗi là TRUE thì mã trong khối 'ELSE' sẽ được thực thi. | Được sử dụng để chọn từ nhiều hơn hai lựa chọn thay thế. |
NESTED-NẾU | Cho phép một hoặc nhiều câu lệnh IF-THEN hoặc IF-THEN-ELSIF bên trong (các) câu lệnh IF-THEN hoặc IF-THEN-ELSIF khác. | Chủ yếu được sử dụng trong tình huống điều kiện lồng nhau. |