zoukankan      html  css  js  c++  java
  • pl/sql基础

    在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语句或尽量少用。
  • 相关阅读:
    6-MySQL-Ubuntu-操作数据表的基本操作(一)
    5-MySQL-Ubuntu-操作数据库的基本操作语句
    11-Ubuntu-根目录下各目录的功能详细介绍
    4-Ubuntu-启动/关闭/重启mysql服务
    3-Windows-CMD启动mysql服务-连接本地mysql服务-连接远程mysql服务
    2-Ubuntu命令安装mysql服务器和客户端及安装后的简单验证操作
    1-Navicat无法远程连接Ubuntu上的MySQL(已解决)
    10-python基础—索引与切片总结
    Useful Things To Know About Machine Learning (机器学习中一些有用的知识)
    How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文
  • 原文地址:https://www.cnblogs.com/nghygaojun/p/3068504.html
Copyright © 2011-2022 走看看