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;