PL/SQL的条件和顺序控制语句

在PL/SQL中,也包含了如java、c语言中的if、if...else、if...else if...else、case(即switch)、goto等基本的顺序控制语句。

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;
一个不注意小事情的人,永远不会成功大事业。——戴尔·卡耐基
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号