plsql(一)

常见访问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;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值