zoukankan      html  css  js  c++  java
  • Oracle中PL/SQL的执行部分和各种流程控制

    Oracle中PL/SQL的执行部分和异常部分

    一.PL/SQL的执行部分。

    • 赋值语句。

        赋值语句分两种,一种是定义一个变量,然后接收用户的IO赋值;另一种是通过SQL查询结果赋值。

        用户赋值举例:  

    set serveroutput on;
    accept abc prompt '请输入abc的值';
    DECLARE
         a int:= &abc;
    BEGIN
         dbms_output.put_line(a);
    END;
    

        查询赋值举例: 

    set serveroutput on;
    DECLARE
      str varchar2(20);
    BEGIN
      select ename into str from emp where empno='7369';
      dbms_output.put_line(str);
    END;
    
    • 流程控制语句。

        PL/SQL的主要控制语句如下:

          1.if...then      elsif … then      end if;

            判断if正确则执行then,否则执行else(elsif为嵌套判断)

            注意elsif,里面少一下e.

          2.Case  var  when … then    when … then   end

            有逻辑的从数值中做出选择

          3.Loop     exit    end loop

            循环控制,用判断语句执行exit

          4.Loop       exit when …        end loop

            同上,当when为真时执行exit

          5.while..loop         end loop

            当while为真时循环

          6.for...in...loop        end loop

            已知循环次数的循环

        因为流程控制比较多,在这里就不一一举实例了,写几个比较经典的程序给大家看一下。

        ********打印9*9乘法表*********

            for in..loop

    set serveroutput on;
    DECLARE
      i number;
      j number;
    BEGIN
     for i in 1..9 loop
      for j in 1..i loop
        dbms_output.put(i||'*'||j||'='||(i*j)||'  ');
      end loop;
      dbms_output.put_line('');
     end loop;
    END;
    

            while  loop

    set serveroutput on;
    declare
      i number:=1;
      j number:=1;
    begin
      while i<10 loop
        while j<=i loop
          dbms_output.put(i||'*'||j||'='||(i*j)||'  ');
          j:=j+1;
        end loop;
        i:=i+1;
        j:=1;
        dbms_output.put_line('');
      end loop;
    end;
    

      

        *********计算1+2+..+10的值*********

          loop exit  & loop exit when

    set serveroutput on;                                
    declare
      i number:=1;
      i_sum number:=0;
    begin
      loop
        i_sum:=i_sum+i;
        i:=i+1;
        if i>10 then 
          exit;
        end if; 
      end loop;
      dbms_output.put(i_sum);
      dbms_output.put_line('');                 
    end;

      注意:put只是把输出结果放入缓冲区,直到遇到put_line时才会输出。所以只有put的时候,不会显示i_sum的结果。

      可以把 if i>10 then exit; end if;  换成exit when i>10;这样就成为了loop ..exit when .. end loop 结构。

      *********输入一个字符,判断是字母、数字还是其他字符****************

         if then elsif else

    set serveroutput on;
    declare
     i_char varchar2(2); 
    begin
      i_char:=&abc;
      if regexp_like(i_char,'^[a-z]$')   then
        dbms_output.put_line('输入的是字母');
      elsif  regexp_like(i_char,'^[0-9]$') then
        dbms_output.put_line('输入的是数字');
      else
        dbms_output.put_line('输入的是其他字符');
      end if;
    end;
    

        case  when

    set serveroutput on;
    declare
      i_char varchar2(2);
      i_result varchar2(30);
    begin
      i_char:=&abc;
      i_result:=
      case 
      when regexp_like(i_char,'^[a-z]$')   then
        '输入的是字母'
      when regexp_like(i_char,'^[0-9]$')   then
        '输入的是数字'
      else
        '输入的是其他字符'
      end;
      dbms_output.put_line(i_result);
    end;
    

    注意:在提示窗口中输入的时候,字符串一定要加单引号,否则就会出错,本人每次在这里都要拌一下。  

    •  SQL语句

      SQL语句就是数据库查询语句,比较简单就不在这里说了。

    •  游标语句

     二.异常部分。

      数据库中的异常跟java中的异常的机制和作用原理是一样的,只是代码和格式不一样,数据库中的异常分为三类:系统异常(预定义异常)、自定义异常以及引发应用程序异常。

    •   系统异常
         PL/SQL程序在运行过程中,可能会出现错误或异常现象

         例如:无法建立到Oracle的连接或用0做除数。好的程序应该对可能发生的异常情况进行处理,异常处理代码在EXCEPTION块中实现

         可以使用WHEN语句来定义异常。WHEN语句的使用方法如下:

          EXCEPTION

                 WHEN <异常情况名> THEN

                       <异常处理代码>

                 WHEN <异常情况名> THEN

                     <异常处理代码>

                   ...

                 WHEN OTHERS THEN

                    <异常处理代码>

        常见的系统异常


     

     

     

     异常名称  异常码 说明 
     NO_DATA_FOUND  ORA-01403 select into语句中没有返回任何记录 
     TOO_MANY_ROWS ORA-01422  select into语句中返回多行数据。 
     ZERO_DIVDE  ORA-01476 试图用0作为除数。 
     DUP_VAL_ON_INDEX  ORA-00001 试图向唯一索引列插入重复值 
     INVALID_CURSOR ORA-01001  试图进行非法游标操作。 
     CURSOR_ALREADY_OPEN ORA-06511  试图打开一个已经打开的游标。 
     INVALID_NUMBER ORA-01722  试图将数字转换为字符串。 
     VALUE_ERROR    

    在产生大小限制错误时出现。如,变量中的列值超出变量的大小


    LOGIN_DENIED

       输入的用户名或者密码无效时出现。

     


    •       自定义异常  

          当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。

          对于这类异常情况的处理,步骤如下:

          在PL/SQL 块的定义部分定义异常情况:

          <异常名称>  exception;

          在PL/SQL 块的执行部分RAISE异常:

          RAISE <异常名称>;

          在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

          WHEN <异常名称> THEN

            代码... 

    •       引发应用程序异常
  • 相关阅读:
    Finance_Time-Series-Analysis-with-app-in-R
    Linear_algebra_06_二次型
    Linear_algebra_05_相似对角形
    病理学
    S&p_14_参数的假设检验
    S&p_13_参数区间估计
    Finance_Analysis-of-Financial-Time-Series
    817. Linked List Components
    811. Subdomain Visit Count
    807. Max Increase to Keep City Skyline
  • 原文地址:https://www.cnblogs.com/bzx888/p/4810573.html
Copyright © 2011-2022 走看看