十三、PL/SQL控制流程

1、数据库赋值

  数据库赋值是通过SELECT语句来完成的,每次执行SELECT语句就赋值一次,一般要求被赋值变量与SELECT中的列名要一一对应,不能将SELECT语句中的列赋值给布尔变量。

2、条件语句:

语法1:

IF<布尔表达式> THEN

PL/SQL 和SQL语句;

END IF;

语法2:

IF<布尔表达式> THEN

PL/SQL 和SQL语句;

ELSE

其它语句;

END IF;

语法3

IF <布尔表达式> THEN

PL/SQL 和SQL语句;

ELSIF< 其它布尔表达式> THEN

其它语句;

ELSIF< 其它布尔表达式> THEN

其它语句;

ELSE

其它语句;

END IF; 

语法4

CASE 表达式 (switch)

CASEselector

WHENexpression1 THENresult1

WHENexpression2 THENresult2

WHENexpressionN THENresultN

[ ELSEresultN+1]

END;

|实例1|

使用 If then elsif then … else end if;

declare

       v_sal student.sal%type;

begin

       select sal into v_sal from student where xuehao='12';

      if(v_sal>=10000)

       then dbms_output.put_line('sal>=10000');

       elsif(v_sal>5000 and v_sal<10000)

       then dbms_output.put_line('5000<= sal <10000');

       else dbms_output.put_line('sal<5000');

       end if;

end;

/

|实例2|

使用 case when then when then else end;

备注:该方法很有局限性

declare

     v_sal student.sal%type;

     v_temp varchar2(30);

begin

     select sal into v_sal from student where xuehao='11';

     v_temp:=

     case trunc(v_sal/5000) when 0 then 'sal<5000'

                            when 1 then '5000<=sal<10000'

                            else 'sal>=10000'

     end;

     dbms_output.put_line(v_temp);

end;

3、循环语句

语法1:loop exit when end loop;

LOOP

要执行的语句;

EXIT WHEN<条件语句> ;/*条件满足,退出循环语句*/

END LOOP;

|实例1|

declare

     int number(2):=1;

begin

     loop

         int :=int+1;

         dbms_output.put_line('int的当前值为'||int);

     exit when int=10;

     end loop;

end;

语法2:WHILE 循环

备注:相较语法1,推荐使用语法2

WHILE<布尔表达式> LOOP

要执行的语句;

END LOOP;

|实例1|

declare

     v_num number:=1;

begin

     while v_num<=10 loop

     dbms_output.put_line('v_num当前的值为:'||v_num);

     v_num:=v_num+1;

     end loop;

end;

 

语法3:for循环

FOR循环计数器IN [REVERSE ] 下限.. 上限LOOP  (循环计数器也可以理解为是一个变量参数)

要执行的语句;

END LOOP;

备注:for循环主要是对数字式的循环

每循环一次,循环变量自动加1;

使用关键字REVERSE,循环变量自动减1。

跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。

|实例1|

循环1到10之间的数字,包含1和10

begin

     for int in 1..10 loop

     dbms_output.put_line('int的当前值为:'||int);

end loop;

end;

 

|实例2|

2-100之间的素数

什么是素数/质数:只有1和它本身两个因素的自然数。

A、 对x对2取模 为0  v_flag=0  v_y:=v_y+1

B、  

方法1

declare

     v_x number:=2;

     v_y number:=2;

     v_flag number(1):=1;

begin

     dbms_output.put_line('质数如下:');

     while v_x<=100 loop

           while v_y <=sqrt(v_x) loop

           if v_x mod v_y=0 then v_flag:=0; end if;

           v_y:=v_y+1;

           end loop;

           if (v_flag=1) then dbms_output.put_line(v_x);

           end if;

           v_flag:=1;

         v_x:=v_x+1;

         v_y:=2;

    end loop;

end;

 

方法2

declare

     --标记值,若为1,则是素数,否则不是

     v_flag number(1):=0;

begin

     for x in 2..100 loop

     v_flag:=1;

     for y in 2..sqrt(x) loop

         if x mod y=0 then

         v_flag:=0;

         goto label;

         end if;

      end loop;

      <<label>>

          if v_flag=1 then

          dbms_output.put_line(x);

          end if;

       end loop;

end;

|实例3 |

使用循环语句打印1-100 包含1和100

方法1:LOOP ... EXIT WHEN ... END LOOP

declare

     v_x number(3):=1;

begin

     loop

         --循环体

         dbms_output.put_line(v_x);

         --循环条件

         exit when v_x=100;

         --迭代条件

         v_x:=v_x+1;

     end loop;

end;

 

方法2:WHILE ... LOOP ... END LOOP

Declare

    --初始化参数

     v_x number(3):=1;

begin

    --循环条件

     while v_x<=100 loop

     --循环体

     dbms_output.put_line(v_x);

     --迭代条件

     V_x:=v_x+1;

     end loop;

end;

 

方法3:for 循环计数器名字 in 上限值..下限值 loop end loop;

begin

     for int in 1..100 loop

     dbms_output.put_line(int);

     end loop;

end;

|实例4|

打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”

方法1

Declare

Begin

     for i in 1..100 loop

     dbms_output.put_line(i);

     if(i=50) then

     goto label;

     end if;

     end loop;

     <<label>>

     dbms_output.put_line('打印结束');

end;

方法2

begin

     for i in 1..100 loop

        dbms_output.put_line(i);

       if(i mod 50=0) then dbms_output.put_line('打印结束');

       exit;

       end if;

    end loop;

end;

/

posted @ 2016-12-04 18:20  爱笑的berg  阅读(203)  评论(0)    收藏  举报