plsql(一)

来源:互联网 发布:天龙八部清风怡江美工 编辑:程序博客网 时间:2024/06/05 00:02
常见访问oracle的技术
PLSQL     过程化sql   procedure(存储过程)
proc/c++  使用c和c++访问oracle数据库
odbc/ado  vc访问数据库的技术
sqlj/jdbc java 访问数据库的技术

plsql 扩展了sql
1.变量 和数据类型
2.控制语句 if   for  goto
3.过程和 函数
4.对象和对象的函数

plsql的程序结构declare    /*申明区      定义变量 和 定义类型 */begin    /*执行区       执行sql语句 和plsql语句*/exception    /*异常处理区      处理错误的区域*/end;


设置输出并测试

set serveroutput on/*测试*/begin    dbms_output.put_line('hello plsql'); end;/

一plsql中的变量
1.变量的定义 和 初始化
declare    var_id     number:=100;    var_name   varchar2(30):='test';begin    dbms_output.put_line(var_id||':'||    var_name); end;/

2.变量的修饰
  constant     not null
 declare    /* 定义变量 */    var_id  constant   number:=1000;    var_name   varchar2(30) not null:='a'; begin    /* 赋值*/    var_id:=1001; */    var_name:='test';    dbms_output.put_line(var_id||':'||    var_name);   end;/

一个变量声明为not null 必须赋初始值 ,因为
任何一个变量 定义之后不赋值 值都是NULL.


3.变量的类型
  标量类型
  数字类型   number    binary_integer
  字符类型   char      varchar2
  布尔类型   boolean    (true  false NULL)
  日期类型   date
  组合类型
  record     table
  参考类型  引用类型
  ref cursor
  大类型
  CLOB 
  BLOB     0-4g
  BFILE    (一般不使用这种类型 因为存储数据
             的路径就可以解决问题)


4.使用%type 得到表的字段对应的类型
  表名.字段名%type
  declare      var_id    s_emp.id%type;      var_name  s_emp.first_name%type;  begin      /* 使用sql语句给变量赋值 */      select  id,first_name into var_id,var_name      from s_emp  where  id=1;       dbms_output.put_line(var_id||':'      ||var_name);  end;

5.记录类型   record 类型
  /*定义一个类似于c语言结构体的类型 */
  type  类型名  is record(
      字段名   类型,
      字段名   类型,
      字段名   类型
  );


  把s_emp 表中的id  first_name salary 
  对应的类型取出来定义变量  
  然后把id=1的数据赋值给 记录变量
  输出这些信息
  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
      /* 使用sql 给记录类型的变量赋值 */
      select  id,first_name,salary  into var_emp
          from s_emp where id=1;
      dbms_output.put_line(var_emp.id||':'||
      var_emp.name||':'||var_emp.salary);
  end;
-------------------------
  /*当查询的字段数 少于记录类型的字段数?
    没有赋值的字段是NULL值*/
----------------------------------------------
特殊的记录类型
表名%rowtype  取得表的一行对应的类型
s_emp%rowtype

declare    /*使用表的一行的类型定义一个变量*/    var_emp   s_emp%rowtype;    var_emp2   s_emp%rowtype;begin    select * into var_emp2 from s_emp where id=1;    var_emp:=var_emp2;    dbms_output.put_line(var_emp.id||':'||    var_emp.first_name||':'||var_emp.salary);end; 
%rowtype 就是一个字段名和表头中的字段名
和字段顺序完全相同的记录类型。

6. 类似于c数组的类型  table类型

declare    /*定义一个table类型*/    type   numstype  is table of  s_emp.id%type    index by binary_integer;    var_nums  numstype;    var_ind   binary_integer:=1;begin    var_nums(1):=100;    var_nums(2):=300;    var_nums(3):=800;    select salary into var_nums(4) from s_emp        where id=1;    /*访问table类型的变量*/    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;



/*下标不连续
  迭代器思想
  first() 得到第一个元素对应的下标
  last()  最后一个元素对应的下标
  next(n) 根据一个元素的下标得到下一个元素的
  下标*/
declare    /*定义一个table类型*/    type   numstype  is table of  s_emp.id%type    index by binary_integer;    var_nums  numstype;    var_ind   binary_integer:=1;begin    var_nums(1):=100;    var_nums(5):=300;    var_nums(3):=800;    select salary into var_nums(4) from s_emp        where id=1;    /*访问table类型的变量*/    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.last();    dbms_output.put_line(var_nums(var_ind));end;

7 变量的作用域和 可见性(跟c语言完全一样)

二. 控制语句
1)分支语句
  if a>b  then
  end if;
------------------
  if  a>b  then 
  else
  end if;
--------------------
  if  a<b  then
  elsif  a<c then
  elsif  a<d then
  end if;
--------------
 
2).循环语句
  a.简单循环
    1.语法
    loop 
        /*循环代码*/
    end loop;
一个例子
    /*从1 输出到 10*/    declare       var_i   number;    begin       var_i:=1;        loop           dbms_output.put_line(var_i);   /*退出循环*/   exit when  var_i=10;   var_i:=var_i+1;       end loop;    end;
    /*如何退出循环?*/
    exit   when   退出条件;
    if 退出条件 then
       exit;
    end if;

   ------------------------
   b.while 循环
     .while 循环的语法

       while 循环条件  loop

       end loop;
--------------------
   c.for 循环 ----智能循环
     1.for循环语法
       for  变量 in  a..b  loop
          
       end loop;
     2.输出1到10
       begin
           for  var_i in 1..10 loop
      dbms_output.put_line(var_i);
  end loop;
       end;
     3.for循环中的变量不允许修改
     4.如何反向输出  输出10 到 1
       begin
           for  var_i in reverse 1..10 loop
      dbms_output.put_line(var_i);
               exit  when var_i=5; 
  end loop;
       end;
----------------------------
    d.循环的嵌套 --如何退出循环

   1.使用类似c语言的goto 语句
      
declare          var_x   number:=1;  var_y   number:=1;      begin          loop              var_y:=1;      loop          dbms_output.put_line(var_y);  /*满足一个条件 退出外层循环*/                  if var_y=3 then      goto outerloop;  end if;  var_y:=var_y+1;              end loop;      exit  when var_x=3;      var_x:=var_x+1;  end  loop;  <<outerloop>>  NULL;      end;


    2.plsql中可以把标签放前面
    
 declare          var_x   number:=1;  var_y   number:=1;      begin          <<outerloop>>          loop              var_y:=1;      loop          dbms_output.put_line(var_y);  /*满足一个条件 退出外层循环*/                  if var_y=3 then      exit outerloop;  end if;  var_y:=var_y+1;              end loop;      exit  when var_x=3;      var_x:=var_x+1;  end  loop;      end;

原创粉丝点击