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语句或尽量少用。

你可能感兴趣的:(pl/sql)