1、IF语句
在程序中可以通过if语句来实现按条件进行分支的逻辑。if语句有三种形式:
a)IF THEN . . . END IF;
IF condition THEN -- 待执行语句 END IF;
如果condition=true,则执行IF语句中的语句;否则(false、null)不执行。如:
DECALRE vc_sex VARCHAR2(10); BEGIN vc_sex := 'male'; IF vc_sex = 'male' THEN DBMS_OUTPUT.PUT_LINE('男(male)'); END IF; END;
b)IF THEN . . . ELSE . . . END IF;
IF condition THEN -- condition=true执行的代码 ELSE -- condition=false或null执行的代码 END IF;
如:
DECALRE vc_sex VARCHAR2(10); BEGIN vc_sex := 'male'; IF vc_sex = 'male' THEN DBMS_OUTPUT.PUT_LINE('男(male)'); ELSE DBMS_OUTPUT.PUT_LINE('女(famale)'); END IF; END;
c)IF THEN . . . ELSIF . . . ELSE . . . END IF;
IF condition THEN -- condition=true执行,然后跳过该IF语句 ELSIF condition THEN -- condition=true执行,然后跳过该IF语句 ELSIF condition THEN -- condition=true执行,然后跳过该IF语句 END IF;
如:
DECALRE vc_sex VARCHAR2(10); BEGIN vc_sex := 'male'; IF vc_sex = 'male' THEN DBMS_OUTPUT.PUT_LINE('男(male)'); ELSIF vc_sex = 'famale' THEN DBMS_OUTPUT.PUT_LINE('女(famale)'); ELSE DBMS_OUTPUT.PUT_LINE('其他(other)'); END IF; END;
2、避免IF语法陷阱
a)一个IF总要有一个匹配的END IF
b)关键字END和IF之间必须有空格
c)关键字ELSIF不要夹带E(ELSEIF)
d)只在关键字END IF后使用分号(;)
e)如果在多个ELSIF语句中都返回true,则只执行第一个返回true的ELSIF语句。
3、短路求值
PL/SQL使用的短路求值法,也就是说PL/SQL不需要一个IF语句的所有表达式都去求值。如:IF语句中的第一个条件为FALSE或者NULL,则PL/SQL会停止对表达式继续求值,立即跳转到ELSE分支上:
IF condition1 AND condition2 THEN . . . ELSE . . . END IF;
但是在下面条件没有短路:
my_boolean := condition1 AND condition2;
如果condition1=NULL,my_boolean可能为NULL或FALSE,取决于condition2。
IF condition1 OR condition2 THEN . . . 如果condition1=TRUE,则直接执行该处代码 ELSE . . . END IF;
如果一个条件的求值代价非常昂贵,在将该条件放置到IF THEN的后面(AND 和 OR)。如:
IF 求值容易 OR 求值昂贵 THEN . . . ELSE . . . END IF;
4、CASE语句和表达式
a)简单的CASE语句
根据一个简单的表达式结果来选择要执行的PL/SQL语句。如:
CASE mode WHEN 'add' THEN INSERT INTO . . . WHEN 'update' THEN UPDATE . . . WHEN 'delete' THEN DELETE FROM . . . ELSE other statement END CASE;
如果没有指定ELSE语句,当mode没有满足任何一个WHEN时,就抛出CASE_NOT_FOUND。ELSE的默认实现
ELSE RAISE CASE_NOT_FOUND;
我们可以使用CASE语句来改写IF ELSIF语句。如下:
IF vc_sex = 'male' THEN DBMS_OUTPUT.PUT_LINE('男(male)'); ELSIF vc_sex = 'famale' THEN DBMS_OUTPUT.PUT_LINE('女(famale)'); ELSE DBMS_OUTPUT.PUT_LINE('其他(other)'); END IF;
改写如下:
CASE TRUE WHEN vc_sex = 'male' THEN DBMS_OUTPUT.PUT_LINE('男(male)'); WHEN vc_sex = 'famale' THEN DBMS_OUTPUT.PUT_LINE('女(famale)'); ELSE DBMS_OUTPUT.PUT_LINE('其他(other)'); -- 要实现,否则当全部没有满足WHEN时将抛出异常 END CASE;
b)搜索形式的CASE语句
一个搜索型CASE语句会对一系列的布尔值表达式求值,一旦某个表达死求值结果为TRUE,就会执行和这个表达式关联的一系列语句。本质上,一个搜索型CASE语句等价于前面介绍的CASE TRUE语句。如:
CASE WHEN vc_sex = 'male' THEN DBMS_OUTPUT.PUT_LINE('男(male)'); WHEN vc_sex = 'famale' THEN DBMS_OUTPUT.PUT_LINE('女(famale)'); ELSE DBMS_OUTPUT.PUT_LINE('其他(other)'); -- 要实现,否则当全部没有满足WHEN时将抛出异常 END CASE;
其他的和简单CASE语句一样
CASE语句是可以进行嵌套的。如:
CASE mode1 WHEN 'add' THEN CASE mode2 WHEN 'add2' THEN INSERT INTO . . . ELSE other statement END CASE; ELSE other statement END CASE;
5、CASE语句表达式
a)简单的CASE表达式
my_variable:= CASE mode WHEN 'add' THEN INSERT INTO . . . ELSE other statement END;
b)搜索型的表达式
my_variable:= CASE mode WHEN 'add' THEN INSERT INTO . . . ELSE other statement END;
使用CASE表达式输出boolean值:
my_variable = CASE flag WHEN TRUE THEN 'true' WHEN FALSE THEN 'false' ELSE 'null' END;
或
my_variable = CASE flag WHEN TRUE THEN 'true' WHEN FALSE THEN 'false' ELSE 'null' END || '这里可以添加其他的值或操作';
如果没有满足WHEN条件,CASE表达式返回NULL且不会抛出异常。
6、GOTO语句
GOTO语句可以无条件地跳转到同一个PL/SQL块中的其他可执行语句处。语法如下:
GOTO label_name . . . 其他可执行语句. . . <<label_name>>
注意:
a)一个标签后面至少有跟着一个可执行的语句
b)GOTO语句的目标标签必须和GOTO语句在同一个作用域内
c)GOTO语句的目标标签必须和GOTO语句在PL/SQL代码块的相同部分
6、NULL语句
NULL语句不会执行任何操作。格式如下:
DECLARE BEGIN NULL; END;
使用NULL语句的原因:
a)添加程序的可读性。如:
IF condition THEN statements END IF;
修改后:
IF condition THEN statements ELSE NULL; -- Do nothing END IF;
b)在标签后面使用NULL
由于“一个标签后面至少有跟着一个可执行的语句”,因此可以写成如下:
DECLARE BEGIN GOTO label; -- other statements <<label>> NULL; END;