zoukankan      html  css  js  c++  java
  • oracle数据库笔记1PL/SQL基础2控制结构

    在PL/SQL块中,可执行部分是由一系列语句组成,由对数据 
    库进行操作的SQL语句,PL/SQL语言的各种流程控制语句。
    
    在块中对数据库查询,增、删、改等对数据的操作是由SQL命
    令完成的
    
    举例1:
          
    SQL>  set  serveroutput  on
          
    SQL> declare
        
           dno1  number:=10;
     
           dname1  varchar2(40);
    
         begin
     
            select  dname    into   dname1    from  dept
         where  deptno=dno1;
            dbms_output.put_line(
    ‘deptno=’||to-char(dno1)||’dname=’||dname1);
         end;
    
    
    在PL/SQL块中使用SELECT语句时注意几点:
    
    
    (1)SELECT 语句必须含有INTO子句。
    
    (2)INTO子句后的变量个数和位置及数据类型必须和 SELECT命令后的字段名表相同。
    
    (3)INTO子句后可以是简单类型变量或组合类型变量。
    
    (4)SELECT语句中的WHERE条件可以包含PL/SQL块中定义的变量及表达式,但变量名不要同库表列
    名相同。
    
    (5)在未使用显示光标的情况下,使用SELECT语句必
    须保证只有一条记录返回,否则会产生异常情况。
    
    
    ey:  向EMP表中插入一新雇员
          
     
    DECLARE
               
        v_empno  emp.empno%TYPE  NOT  NULL:=8000;
              
        v_ename  emp.ename%TYPE:=‘Bill’;
             
        v_job emp.job%TYPE:=‘MANAGER’;
        
        v_sal  emp.sal%TYPE:=2000;
             
        v_comm emp.comm%TYPE:=1000;
             
        v_hiredate  emp.hiredate%TYPE:=SYSDATE;
     
        v_deptno  emp.deptno%TYPE:=10;
             
    BEGIN
         
        INSERT  INTO emp(empno,enamae,job,sal,comm,hiredate,deptno)
     
        VALUES  (v_empno,v_ename,v_job,v_sal,v_comm,v_hiredate,v_deptno);
        COMMIT  WORK;
           
    END;
    
    
    
    ey: 修改职工号为8000雇员的工资,加 工资1000
         
         
    DECLARE 
                
        v_empno  emp.empno%TYPE:=8000;
               
        v_addsal emp.sal%TYPE;
               
    BEGIN
                
        v_addsal:=1000;
               
        UPDATE  EMP
                           
        SET  sal=sal+v_addsal
                     
        WHERE  empno=v_empno;
                  
        COMMIT   WORK;
              
    END; 
    
    
    PL/SQL流程控制:
    
    流程控制语句使PL/SQL程序象高级语言程序一样,具由三种基本结构:顺序、分支、循环
    
     提供结构化程序设计的三种流程控制语句有:
    
    条件控制语句;
    循环控制语句;
    GOTO  语句;
    
    1. 条件控制语句:(IF 语句)
         三种语句形式:
           
     a.IF  条件 THEN
                        
            语句序列;
        END IF;
           
    
     b.IF  条件 THEN
      
            语句序列1;
        ELSE
     
            语句序列2;
             
        END IF;
    
    
    c. IF  条件1 THEN
        
            语句序列1;
       
        ELSIF  条件2  THEN
     
            语句序列2;
           
              …
                  
                      [ELSE
        
             语句序列n;]
                   
        END IF;
    
    
    其中,条件可以是逻辑变量或用逻辑运算符 AND,OR,NOT 连接的逻辑表达式,或关系表达式。其值只能TRUE, FALSE或NULL。
    
    当条件为真时,执行THEN子句中的语句序列;
    当条件为假或空时,执行ELSE子句中的语句序列
    
    在THEN和ELSE子句中可包含IF语句 
    
    注意:
    
        ①.每个IF 语句都有自己的THEN,以IF开始的语句行 不跟语句结束符(;)。
     
       ②.每个IF 语句块以相应的END IF 结束。
    
      例:  if  not (var1<=10) then
    
                  var2:=var1+20;     
                  
            end if;
    
    
    
     
       ey:  
            if  var1>10  then
     
                if  var2< var1  then
       
                     var2:=var1+20;
      
                end if;
      
            end if;
    
         ③.每条IF 语句有且只有一个ELSE 子句;
         ④.ELSE子句行不跟语句结束符(;)
         ⑤.ELSIF无匹配的END IF
    
    在IF语句中可以包含任意数目的elsif子句,这种结构用于替代嵌套的    if-then-else   结构。
    
    
    最后ELSE子句是可选项,在此种情况下,每一个条件对应一个语句 序列,条件由顶向底计算.
    
    任何一个条件为真(TRUE)时,执行相对应的语
    句序列 。若各条件均为FALSE或NULL则执行ELSE子句中语句序列。
    
    ey:
    
        if   var1> 10  then
      
             var2:=var1+20;
      
        else 
     
             if  var1   between  7  and  8 then
      
                 var2:=var1*var1;
      
              else  var2:=2*var1 ;
      
              end if;
         end if;
    
    
    可写成:
    
        if    var1>10 then
       
              var2:=var1+20;
     
        elsif  var1  between  7  and  8  then
      
              var2:=var1*var1;
         
        else
                  
              var2:=2*var1;
        
        end if;     
    
    2.循环控制语句(三种形式)
    
    
    1).  LOOP
      
               语句序列;
    
               [EXIT  [WHEN  条件;] ]    
           END LOOP;
    
    语句中,若无EXIT语句,则进行无限循环;
    若不选EXIT中 
        WHEN项,则执行完语句序列后当执行到EXIT时,立即退出
    循环,只执行一遍
    有WHEN选项,每执行到EXIT语句,PL\SQL就计算作
       为条件的表达式值,是     TRUE    则   退出循环,否则继续执行该循
       环语句序列.
    
    
    
    例:   
      cnt:=1;
     
      loop
       
          cnt:=cnt+1;
        
          exit  when  cnt>100;
      
      end loop;
    
    
    
    可改写成:
     
      cnt:=1;
     
      loop
     
          cnt:=cnt+1;
      
          if cnt>100  then
     
             exit;
           
          endif;
      
      end loop;
    
    
    
     给十号部门增加新雇员,只确定雇员号,其它信息忽略。
    
    DECLRE
     
       v_empno  emp.empno%TYPE:=8000;
    
    BEGIN
        
       LOOP
      
          INSERT  INTO emp(deptno,empno)
      
          VALUES(10,v_empno);
          v_empno:=v_empno+100;
     
          EXIT   WHEN  v_empno>=9000;
     
       END LOOP;
    
    END;
    
    
    
    
    2)FOR循环(或数值FOR 循环)
    
    FOR    计数器   IN  [REVERSE]  下界..上界  LOOP
      
                     语句序列;
       
    END LOOP;
    
    1.计数器是控制循环次数的变量,不用说明,系统默认为是整型 
    2.数值FOR循环语句在一指定整数范围中循环,
     由下界,上界两整数型表达式值确定循环次数,故循环次数是已知的
    3.第一次进入FOR循环时计算范围,求两表达式
     值,此后不再重新计算
    
    4.可选项REVERSE若选用,则计数器从上界递减到下界,否则由下界递增到上界,以控制循环体循环. 
    
    DECLARE
    
       TYPE  array  is  table  of  number
         index  by  binary_integer;
       my_array   array;
     
    BEGIN
      
         FOR  i  IN   1 .. 10  LOOP
      
           my_array(i):=2*i;
           
         END LOOP;
              
         FOR i   IN  1 .. 10  LOOP
         
            dbms_output.put_Line(to_char(my_array(i)));  
         END LOOP;
           
    END;
    
    
    
    3) WHILE循环
    
    
    WHILE    条件    LOOP
       
        语句序列;
           
    END LOOP;
    
    
    1. 由条件控制循环次数,先判断后执行,当条件为真,则执行
    一次循环体
    2.然后再判断条件,当条件为假或空时(计算
    条件表达式的值是FALSE或NULL)结束循环;
    
         WHILE   total<=2500  LOOP
     
            select   sal  INTO  salary
      
            from  emp
           
            where    … ;
           
            total:=total +salary;
      
         END LOOP;
    
    4)GOTO语句 (无条件转移)
    
    
    该语句执行,可无条件转移到某一标号(为PL/SQL标识符)标示
     的语句,改变原执 行顺序
    
    
    形式1:
     <<标号>>
    ............
     GOTO  标号; 
    
    
    
    形式2:
    
     GOTO  标号; 
    ............
     <<标号>>
    
    该语句标号是在它的范围内唯一,必须位于可执行语句或一  
      PL/SQL块之前。
    
    注意:一个GOTO语句可以在同一个块中的语句之间进行转移,
    
    但不能转移到IF语句、循环语句或子块中,
    可以从一个结
     构内部转移到其外部
     在程序设计中一般不用GOTO语句或尽量少用。
    

      

  • 相关阅读:
    ylb: SQL表的高级查询-子查询
    ylb:SQL 系统函数
    ylb:SQL 常用函数
    ylb:exists(存在)的应用实例
    ylb:子查询(嵌套子查询)和子查询(相关子查询)
    ylb:多表的连接与练习(第三方关联表的应用)
    ylb:表的结构的修改和基本约束
    ylb:SQL Server中的escape(逃逸)
    ylb:SQL Server中的时间函数
    ylb:创建数据库、表,对表的增查改删语句
  • 原文地址:https://www.cnblogs.com/wust221/p/3068164.html
Copyright © 2011-2022 走看看