1.条件
1)IF条件判断逻辑结构
If条件判断逻辑结构有三种表达方式。
①表达式一:
1)IF条件判断逻辑结构
If条件判断逻辑结构有三种表达方式。
①表达式一:
IF Condition THEN
Statement;
END IF;
Statement;
END IF;
该表达式的功能为:若条件为真,执行then后的语句;否则,跳出条件语句执行end if后的语句。
②表达式二:
IF Condition THEN
Statements_1;
ELSE
Statements_2;
END IF;
Statements_1;
ELSE
Statements_2;
END IF;
该表达式的功能为:如果条件为真执行then后的语句,否则执行else后的语句。
③表达式三:
IF Condition1 THEN
Statements_1;
ELSEIF Condition2 THEN
Statements_2;
ELSE
Statements_3;
END IF;
Statements_1;
ELSEIF Condition2 THEN
Statements_2;
ELSE
Statements_3;
END IF;
该表达式的功能为:如果if后的条件成立,执行then后面的语句,否则判断elseif后面的条件,条件成立执行第二个then后面的语句,否则执行else后的语句。这是条件语句嵌套。IF 可以嵌套,可以在IF 或IF ..ELSE语句中使用IF或IF…ELSE语句。
2)CASE表达式
CASE语句的基本格式如下:
CASE Grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE ('Excellent');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE ('Very Good');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE ('Good');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE ('Fair');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE ('Poor');
ELSE DBMS_OUTPUT.PUT_LINE ('No such grade');
END CASE;
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE ('Excellent');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE ('Very Good');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE ('Good');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE ('Fair');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE ('Poor');
ELSE DBMS_OUTPUT.PUT_LINE ('No such grade');
END CASE;
CASE语句的功能:首先设定变量的值作为条件,然后顺序检查表达式,一旦从中找到与条件匹配的表达式值,就停止CASE语句的处理。
2.循环
1)LOOP…EXIT…END循环控制语句
LOOP循环语句是其中最基本的一种,格式如下:
LOOP
Statements;
END LOOP;
Statements;
END LOOP;
这种循环语句是没有终止的,如果不人为控制的话,其中的Statements将会无限地执行。一般可以通过加入EXIT语句来终结该循环。
2)WHILE…LOOP循环控制语句
WHILE…LOOP循环控制语句的格式如下:
WHILE Condition
LOOP
Statements;
END LOOP;
LOOP
Statements;
END LOOP;
WHILE…LOOP有一个条件与循环相联系,如果条件为TRUE,则执行循环体内的语句,如果结果为FALSE,则结束循环。
3)FOR…LOOP循环控制语句
FOR…LOOP循环控制语句的格式如下:
FOR Counter IN [REVERSE] Start_Range…End_Range
LOOP
Statements;
END LOOP;
LOOP
Statements;
END LOOP;
LOOP和WHILE循环的循环次数都是不确定的,FOR循环的循环次数是固定的,Counter是一个隐式声明的变量,初始值是Start_Range,第二个值是Start_Range + 1,直到End_Range,如果Start_Range等于End _Range,那么循环将执行一次。如果使用了REVERSE关键字,那么范围将是一个降序。
3.跳转
GOTO语句的格式如下:
GOTO LABEL;
执行GOTO语句时,控制会立即转到由标签标记的语句(使用<<>>声明)。PL/SQL中对GOTO语句有一些限制,对于块、循环、IF语句而言,从外层跳转到内层是非法的。
DECLARE
X NUMBER(3);
Y NUMBER(3);
V_COUNTER NUMBER(2);
BEGIN
X := 100;
FOR V_COUNTER IN 1 .. 10 LOOP
IF V_COUNTER = 4 THEN
GOTO end_of_loop;
END IF;
X := X + 10;
END LOOP;
<<end_of_loop>>
Y := X;
dbms_output.put_line('Y:'||Y);
END;
X NUMBER(3);
Y NUMBER(3);
V_COUNTER NUMBER(2);
BEGIN
X := 100;
FOR V_COUNTER IN 1 .. 10 LOOP
IF V_COUNTER = 4 THEN
GOTO end_of_loop;
END IF;
X := X + 10;
END LOOP;
<<end_of_loop>>
Y := X;
dbms_output.put_line('Y:'||Y);
END;
输出结果为“Y:130”。
4.嵌套
程序块的内部可以有另一个程序块这种情况称为嵌套。嵌套要注意的是变量,定义在最外部程序块中的变量可以在所有子块中使用,如果在子块中定义了与外部程序块变量相同的变量名,在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。同样GOTO语句不能由父块跳转道子块中,反之则是合法的。