plsql_day01

一.常见的访问oracle的技术
   PLSQL    过程化sql (procedure)
   proc/c++ 使用c或者c++ 访问oracle数据库
   ODBC/ADO vc中访问数据库的技术
   SQLJ/JDBC java 访问oracle的技术
   OCI      oracle底层连接接口 
二.plsql的特点
   结构化 模块化编程
   良好的可维护性 
   良好的可移植性  9i  10g  11g
   提升系统的性能 
   
   不编译向异构数据库移植 
   (sqlserver  mysql 存储过程)
 三.plsql 扩展了 sql
   变量和类型
   控制结构   if   for  goto
   过程和 函数
   对象和 方法
 四.plsql 的程序结构
   declare
       /* 声明区  申明区  
          声明变量 定义类型 */
   begin
       /* 执行区 
          执行sql语句 或者 plsql语句 */
   exception
       /* 异常处理区 
          当程序出错时 自动转入异常处理区*/
   end;
   /     
 五.第一个plsql程序 
   begin
     dbms_output.put_line('hello plsql!');
   end;
   / 
  
   set serveroutput  on;
   开发工具:
       sqlplus 
       sqlprogrammer
       plsqldeveloper
 六.变量 
   6.1 标识符
   给变量  类型  函数 过程 等命名的。
   6.2 变量 
   declare
       变量名   类型;
   begin
   
   declare
       var_x    number;
   begin
   
   如果一个变量没有赋值  则这个变量的
   值一定是NULL值。
   6.3 如何给变量赋值
   初始化和赋值 都使用 :=     
   declare
       var_x    number;
   begin
       var_x:=100;
       dbms_output.put_line('var_x='||
       var_x);
   end;
   /
   定义一个字符串类型的变量  长度是30
   给这个变量赋值成  hello  最后打印
   这个变量的值。 
   declare
       var_name    varchar2(30);
   begin
       var_name:='hello';
       dbms_output.put_line('var_name='||
       var_name);
   end;
   /
   6.4 变量的修饰 
   变量名   constant  类型 not null:=值;
   declare
       var_name  constant varchar2(30)
          :='hello';
   begin
       -- var_name:='world';
       dbms_output.put_line(var_name);
   end;
   /
         
   declare
       var_name   varchar2(30) not null
       :='abc';
   begin
       var_name:='test';
       dbms_output.put_line(var_name);
   end;
   /
   
   6.5 变量的类型
   标量类型: char  varchar2  number date
             binary_integer boolean 
   组合类型: record   table 
   参考类型: ref cursor 
   大类型:BLOB  CLOB  BFILE (了解)
         (存储数据在服务器上的位置)
                    
   declare
       var_ind   binary_integer;
       var_f     boolean;
   begin
       var_ind:=10;
       -- var_f:=true;
       var_f:=false;
       if var_f  then
           dbms_output.put_line(var_ind);
       end if;
   end;
   /
  
  七.plsql 扩展的类型的语法
   7.1 定义两个变量  类型分别和s_emp  
   表中 first_name,salary的类型一致。
   然后再把 id=1对应的两个字段的值 
   赋值给这两个变量 输出这两个变量的值。
   declare
       var_name  varchar2(25);
       var_sal   number(11,2);
   begin
       var_name:='Carmen';
       var_sal:=2500;
       dbms_output.put_line(var_name||':'
       ||var_sal);
   end;
   / 
   7.2 表名.字段名%type 来直接获取字段
   对应的类型。
   declare
       var_name  s_emp.first_name%type;
       var_sal   s_emp.salary%type;
   begin
       select  first_name,salary
           into var_name,var_sal
               from s_emp where id=2;
       dbms_output.put_line(var_name||':'
       ||var_sal);
   end;
   /       
   7.3 把id=3的 id  first_name salary
   对应的值查询出来。放入一个类似于c
   语言结构体类型的变量。(record )
   
   7.3.1 record类型语法:
   type  类型名 is record(
       字段名1    类型,
       字段名2    类型,
       字段名3    类型
   );
         
   变量名    类型;
   7.3.2 完成把id=3的数据放入一个结构变量
   declare
       type  emptype is record(
           id     s_emp.id%type,
           name   s_emp.first_name%type,
           salary s_emp.salary%type
       );
       var_emp   emptype;
   begin
       select  id,first_name,salary
           into  var_emp
               from s_emp where id=3;
       dbms_output.put_line(var_emp.id||
       ':'||var_emp.name||':'||
       var_emp.salary);        
   end;
   /
  7.3.3 查询的字段数 少于记录类型字段数 
   declare
       type  emptype is record(
           id     s_emp.id%type,
           name   s_emp.first_name%type,
           salary s_emp.salary%type
       );
       var_emp   emptype;
   begin
       select  first_name,salary
           into  var_emp.name,var_emp.salary
               from s_emp where id=3;
       dbms_output.put_line(var_emp.id||
       ':'||var_emp.name||':'||
       var_emp.salary);        
   end;
   / 
  7.3.4 记录类型变量之间的赋值    
   declare
       type  emptype is record(
           id     s_emp.id%type,
           name   s_emp.first_name%type,
           salary s_emp.salary%type
       );
       var_emp   emptype;
       var_emp2  emptype;
   begin
       select  id,first_name,salary
           into  var_emp2
               from s_emp where id=3;
       -- var_emp:=var_emp2;
       var_emp.salary:=var_emp2.salary;
       var_emp.name:=var_emp2.name;        
       dbms_output.put_line(var_emp.id||
       ':'||var_emp.name||':'||
       var_emp.salary);        
   end;
   /
  7.4 思考如何把id=1的所有的数据放入一个
  记录类型对应的变量中。然后输出这个变量
  对应的id  first_name salary。  
  可以使用 表名%rowtype 获取表的一行对应
  的类型。得到实际上是一个字段名 和 字段
  顺序完全和表头相同的记录类型。
  declare
      var_emp  s_emp%rowtype;
  begin
      select * into var_emp  
          from  s_emp where id=1;
      dbms_output.put_line(var_emp.id||
      ':'||var_emp.first_name||':'||
      var_emp.salary);    
  end;
  /
  7.5 类似于c中数组类型的类型 
     table类型
     7.5.1 table类型的语法
     type  类型名  is  table  of 
       表中元素类型  
       index by binary_integer; 
     7.5.2 举例 
     把 300  500 900 1100 这些数据
     放入一个数组变量中。取得其中的
     一个值。
     declare
         type  numstype  is table of 
           number index by binary_integer;
         var_nums   numstype; 
     begin
         var_nums(-1):=300;
         var_nums(0):=500;
         var_nums(1):=900;
         var_nums(2):=1100;
         dbms_output.put_line
         (var_nums(1));
     end;
     /
    7.5.3 下标连续时对table变量进行遍历
     declare
         type  numstype  is table of 
           number index by binary_integer;
         var_nums   numstype; 
         var_ind    binary_integer;
     begin
         var_nums(-1):=300;
         var_nums(0):=500;
         var_nums(1):=900;
         var_nums(2):=1100;
         var_ind:=-1;
         dbms_output.put_line
         (var_nums(var_ind));
         var_ind:=var_ind+1;
         dbms_output.put_line
         (var_nums(var_ind));
         var_ind:=var_ind+1;
         dbms_output.put_line
         (var_nums(var_ind));
         var_ind:=var_ind+1;
         dbms_output.put_line
         (var_nums(var_ind));
     end;
     /  
     7.5.4 下标不连续时对table变量进行遍历
     迭代器思想:可以根据一个元素的信息
         获取到下一个元素的信息。
     first()  获取第一个元素对应的下标
     next(n)  可以根据一个元素下标n 获得
              下一个元素对应的下标。     
     last()   获取最后一个元素对应的下标
     
     declare
         type  numstype  is table of 
           number index by binary_integer;
         var_nums   numstype; 
         var_ind    binary_integer;
     begin
         var_nums(-1):=300;
         var_nums(-2):=500;
         var_nums(1):=900;
         var_nums(3):=1100;
         var_ind:=var_nums.first();
         dbms_output.put_line
         (var_nums(var_ind));
         var_ind:=var_nums.next(var_ind);
         dbms_output.put_line
         (var_nums(var_ind));
         var_ind:=var_nums.next(var_ind);
         dbms_output.put_line
         (var_nums(var_ind));
         var_ind:=var_nums.next(var_ind);
         dbms_output.put_line
         (var_nums(var_ind));
         var_ind:=var_nums.last();
         dbms_output.put_line
         (var_nums(var_ind));
     end;
     / 
     
八.变量的作用域和可见性
   <<abc>>
   declare
       var_x   number:=1;
   begin
       declare
           var_x  number:=100;
       begin
           /* 局部可以访问全局和局部 */    
           dbms_output.put_line(var_x); 
           dbms_output.put_line(abc.var_x);   
       end;
       /* 全局不能访问局部 */
   end;
   /  
九.控制语句
  9.1 分支语句
  9.1.1 分支语句语法
  if(a>b){            if a>b  then
  
  }                   end if;
  -------------------------------- 
  if(a>b){            if a>b  then
   
  }else{              else 
  
  }                   end if; 
   
  if(a>b){            if    a>b  then
  
  }else if(a>c){      elsif a>c  then 
  
  }else if(a>d){      elsif a>d  then
  
  }                   end if;
  
  if(a>b){            if    a>b  then
  
  }else if(a>c){      elsif a>c  then
  
  }else if(a>d){      elsif a>d  then
  
  }else{              else 
  
  }                   end if;
  
  9.1.2 分支语句练习
  定义三个整数变量  分别赋值 使用分支语句
  选择出这三个变量中的最大值。
  declare
      var_x   number:=100;
      var_y   number:=300;
      var_z   number:=800;
  begin
      var_z:=&var_z;
      if var_x < var_y then
          if var_y < var_z then
              dbms_output.put_line(var_z);
          else
              dbms_output.put_line(var_y);
          end if;
      else
          if var_x < var_z then
              dbms_output.put_line(var_z);
          else
              dbms_output.put_line(var_x);
          end if; 
      end if;
  end;
  /        
  
  declare
      var_x   number:=100;
      var_y   number:=300;
      var_z   number:=800;
      var_max number;
  begin
      var_z:=&var_z;
      var_max:=var_x;
      if  var_max < var_y then
          var_max:=var_y;
      end if;
      if  var_max < var_z then
          var_max:=var_z;
      end if;
      dbms_output.put_line(var_max);
  end;
  /        
      
  9.1.3 分支语句练习    
  验证一下NULL值的特性 
  declare
    var_x   number;
    var_y   number;
  begin
    if  var_x < var_y then
      dbms_output.put_line('var_x<var_y');
    elsif var_x > var_y then
      dbms_output.put_line('var_x>var_y');    
    elsif var_x is null and 
      var_y is null  then
      dbms_output.put_line('var_x is null and 
      var_y is null');
    elsif var_x = var_y then
      dbms_output.put_line('var_x=var_y');
    end if;   
  end;
  / 
 9.2 循环语句
    9.2.1 简单循环
    loop
        /* 要循环执行的代码 */
    end loop;     
    
    declare
        var_x  number:=1;
    begin
        loop
            dbms_output.put_line(var_x);
            var_x:=var_x+1;
        end loop;
    end;
    /
    9.2.2 如何结束循环
    exit  when  结束条件;
    
    if  结束条件  then
        exit;
    end if;
    
    从1输出 10
    declare
        var_x  number:=1;
    begin
        loop
            dbms_output.put_line(var_x);
            exit  when var_x=10;
            var_x:=var_x+1;
        end loop;
    end;
    /
    
    declare
        var_x  number:=1;
    begin
        loop
            dbms_output.put_line(var_x);
            if var_x=10 then
               dbms_output.put_line
               ('end loop');
               exit;
            end if;
            var_x:=var_x+1;
        end loop;
    end;
    /
    
    9.2.3 while 循环 
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值