IF <condition1> THEN <statements to execute when condition1 is true> ELSIF <condition2> THEN <statements to execute when condition2 is true> ELSE <statements to execute when both condition1 and condition2 are false> ENDIF;
注意不要漏掉 THEN 关键字。
可以有多个 ELSIF,但最多有一个 ELSE。
当 IF 和所有的 ELSIF 的条件都是 false 时,才执行 ELSE 块。
ELSIF 和 ELSE 都是可选的。
CASE
CASE <selector> WHEN <expression1> THEN <statements to execute> WHEN <expression2> THEN <statements to execute> ... ELSE <statements to execute> ENDCASE;
grade := 'D'; CASE grade WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Perfect'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Good'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Poor'); ELSE DBMS_OUTPUT.PUT_LINE('No such grade'); ENDCASE;
显然,打印的结果为 No such grade。
循环
loop 循环
LOOP <statements to execute> [EXIT [WHEN condition];] ENDLOOP;
[EXIT [WHEN condition];] 是可选的;若不带上 EXIT 则相当于一个死循环,所以一般使用 EXIT 配合 WHEN 条件来跳出整个循环,如下:
FOR i IN REVERSE 1..5 LOOP result := i * 2; DBMS_OUTPUT.PUT_LINE(result); ENDLOOP;
由于是反向计数,所以打印出来的结果依次为:10, 8, 6, 4, 2。
使用 cursor 游标循环
FOR <record_index> in <cursor_name> LOOP <statements to execute> ENDLOOP;
举个栗子:
CREATEORREPLACEPROCEDURE test_cursor_loop AS CURSOR test_c ISSELECT column1, column2 FROMTABLE; BEGIN FOR test_record IN test_c LOOP DBMS_OUTPUT.PUT_LINE(test_record.column1 || test_record.column2); ENDLOOP; END test_cursor_loop;
捕获异常并处理:EXCEPTION WHEN exception_name THEN <exception handlers>。
举个栗子:
CREATEORREPLACEPROCEDURE test_exception (param INNUMBER) AS test_e EXCEPTION; BEGIN IF param = 0THEN DBMS_OUTPUT.PUT_LINE('No exception!'); ELSE RAISE test_e; ENDIF;
EXCEPTION WHEN test_e THEN DBMS_OUTPUT.PUT_LINE('Throw test_e exception!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Throw other exception!'); END test_exception;