PL/SQL流程控制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL/SQL流程控制相关的知识,希望对你有一定的参考价值。

1  数据库赋值

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

 

 

2 不能将SELECT语句中的列赋值给布尔变量

 

3 条件语句

IF<布尔表达式> THEN

PL/SQL 和SQL语句;

END IF;

 

 

IF<布尔表达式> THEN

PL/SQL 和SQL语句;

ELSE

其它语句;

END IF;

 

IF <布尔表达式> THEN

PL/SQL 和SQL语句;

ELSIF< 其它布尔表达式> THEN

其它语句;

ELSIF< 其它布尔表达式> THEN

其它语句;

ELSE

其它语句;

END IF; 

 

  CASE 表达式 (switch)

CASEselector

WHENexpression1 THENresult1

WHENexpression2 THENresult2

WHENexpressionN THENresultN

[ ELSEresultN+1]

END;

 

 

例子:

 

/*使用 IF ... THEN ... ELSIF ... THEN ...ELSE ... END IF;

要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 ‘salary >= 10000‘;

若在 5000 10000 之间, 则打印 ‘5000<= salary < 10000‘; 否则打印 ‘salary < 5000‘*/

 

 

declare 

   v_salary employees.salary%type;

   

begin

    select salary into v_salary

    from employees

    where employee_id=150;

    

    if(v_salary>=10000) then dbms_output.put_line(‘salary >= 10000‘);

    elsif (v_salary>5000 and v_salary<10000) then dbms_output.put_line(‘5000<= salary < 10000‘);

    else dbms_output.put_line(‘salary <5000‘);

    end if;

 

 

end;

 

方法2

 

 

/*使用 IF ... THEN ... ELSIF ... THEN ...ELSE ... END IF;

要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 ‘salary >= 10000‘;

若在 5000 10000 之间, 则打印 ‘5000<= salary < 10000‘; 否则打印 ‘salary < 5000‘*/

 

 

declare 

   v_salary employees.salary%type;

   v_temp varchar2(30);

begin

    select salary into v_salary

    from employees

    where employee_id=150;

    

    v_temp:=

    case trunc(v_salary/5000) when 0 then ‘salary<5000‘

                         when 1 then ‘5000<= salary< 10000‘

                         else  ‘salary >=10000‘

                   end;

    dbms_output.put_line(v_temp);

 

end;

 

这种方法很有局限性

 

 

4 循环

 

1.  简单循环

LOOP

要执行的语句;

 

 

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

END LOOP;

 

 

3.

DECLARE

int NUMBER(2) :=0;

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;

4.

DECLARE

x NUMBER :=1;

BEGIN

WHILE x<=10 LOOP

DBMS_OUTPUT.PUT_LINE(‘X的当前值为:‘||x);

x:= x+1;

END LOOP;

END;

 

 

3 数字式循环(for循环)

 

FOR循环计数器IN[REVERSE ] 下限.. 上限LOOP

要执行的语句;

END LOOP;

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。

 

5.

BEGIN

FOR int  in 1..10 LOOP

DBMS_OUTPUT.PUT_LINE(‘int 的当前值为: ‘||int);

END LOOP;

 

END;

 

 

 

例子

--2-100之间的素数

declare

  v_i number(3):=2;

  v_j number(3):=2;

  v_flag number (1):=1;

begin 

 

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

    while v_i<=100 loop

          while v_j<=sqrt(v_i) loop

             if v_i mod v_j=0 then v_flag:=0;   end if;

           v_j:=v_j+1;

           end loop;

           if (v_flag=1) then dbms_output.put_line(v_i); end if;

               v_flag:=1;

           v_i:=v_i+1;

           v_j:=2;

           

           end loop;

end;

 

 

第二种方法

 

declare

    v_flag number (1):=1;

begin

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

  for i in 2..100  loop

    for j in 2..sqrt(i) loop

      if(i mod j =0)  then v_flag:=0; goto label; end if;

       end loop;

     << label >>

     if(v_flag=1) then   dbms_output.put_line(i); end if;

         v_flag:=1;

         end loop;

         

  end;

 

其他例子

 

9. 使用循环语句打印 1 - 100.(三种方式)

 

1).  LOOP ... EXIT WHEN ... END LOOP

declare

       --初始化条件

       v_i number(3) := 1;

begin

       loop

       --循环体

        dbms_output.put_line(v_i);

--循环条件

        exit when v_i = 100;

--迭代条件

        v_i := v_i + 1;

       end loop;

end;

 

2). WHILE ... LOOP ... END LOOP

declare

       --初始化条件

       v_i number(3) := 1;

begin

       --循环条件

       while v_i <= 100 loop

     --循环体

             dbms_output.put_line(v_i);

     --迭代条件

             v_i := v_i + 1;

       end loop;

end;

 

3).

begin

       for i in 1 .. 100 loop

             dbms_output.put_line(i);

       end loop;

end;

 

10. 综合使用 if, while 语句, 打印 1 - 100 之间的所有素数

(素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).

declare

  v_flag number(1):=1;

  v_i number(3):=2;

  v_j number(2):=2;

begin

 

  while (v_i<=100) loop

        while v_j <= sqrt(v_i) loop

              if (mod(v_i,v_j)=0) then v_flag:= 0;

      end if;

             

      v_j :=v_j +1;

        end loop;

        

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

end if;

 

        v_flag :=1;

        v_j := 2;

        v_i :=v_i +1;

   end loop;

 

end;

 

 

(法二)使用for循环实现1-100之间的素数的输出

declare

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

  v_flag number(1) := 0;

begin

   for i in 2 .. 100 loop

 

       v_flag := 1;     

         

       for j in 2 .. sqrt(i) loop

           if i mod j = 0 then

              v_flag := 0;

           end if;        

       end loop;

       

       if v_flag = 1 then

           dbms_output.put_line(i);

       end if;

       

   end loop;

end;

 

11. 使用 goto

declare

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

  v_flag number(1) := 0;

begin

   for i in 2 .. 100 loop

       v_flag := 1;     

         

       for j in 2 .. sqrt(i) loop

           if i mod j = 0 then

              v_flag := 0;

              goto label;

           end if;        

       end loop;

       

       <<label>>

       if v_flag = 1 then

           dbms_output.put_line(i);

       end if;

       

   end loop;

end;

 

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

(方法一)

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;

(方法二)

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;

 

以上是关于PL/SQL流程控制的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 流程控制语句

PL/SQL 03 流程控制

PL/SQL流程控制

Oracle之PL/SQL编程_流程控制语句

pl/sql流程控制语句if else条件选择语句

数据库小技能:PL/SQL的流程控制