zoukankan      html  css  js  c++  java
  • PL/SQL编程—游标

    一、游标的相关概念:

      定义:

       游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里

      存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中

      的指针 来提取游标中的数据,然后来进行操作。

      实质:

       是用户在远程客户端上对服务器内存区域的操作,由数据库为用户提供这样的

      一个指针,使得用户能够去检索服务器内存区的数据。

       (1)、 指向上下文区域的句柄或指针

       (2)、上下文区域-用于SQL处理的内存区

       (3)、上下文区域的内容

       - 语句处理的行数

       -指向语句的语法分析表示的指针

      二、游标的类型

       a)静态游标

       -  隐式游标

       -  显式游标

       b)Ref游标

      三、游标具有的属性

       %notfound 询问是否没有结果集

       %found    询问是否存在结果集

       %rowcount 返回受影响的行数

       %isopen   询问游标是否已经打开

      四、隐式游标

       隐式游标 ---由Oracle数据库自动创建,名称是(SQL) ,主要用途是可以返回一个操作是否成功或失败.

       1.有Oracle在内部声明,由系统管理

       2.用于处理

       -DML语句   --注意只能用于DML语句哦。

       -返回单行的查询

       3.用于判断一个操作是否成功.

       SQL%notfound  --返回Boolean值  存在结果集返回 False

       SQL%found    --返回Boolean值   存在结果集返回 True

       SQL%rowcount  --用户成功提取数据的行数

       SQL%isopen   --在隐式游标里一般这个属性是自动打开和关闭的.且任何时候查询都返回False

      示例:向表中插入一行数据,询问是否插入成功.

    declare
       iCount int:=0;
     begin
        insert into place values(2,'beijing');
        DBMS_output.put_line('游标所影响的行数:'||SQL%rowcount);
        if SQL%NotFount then
          DBMS_output.put_line('NotFount为真);
        else
          DBMS_output.put_line('NofFount为假');
        end if;
      
         if SQL%Fount then
          DBMS_output.put_line('Fount为真);
         else
          DBMS_output.put_line('Fount为假');
         end if;
    
          if SQL%isopen then
          DBMS_output.put_line('isOpen为真);
         else
          DBMS_output.put_line('isOpen为假');
         end if;
         
        isCount:=SQL%rowcount;
        DBMS_output.put_line('影响了'||isCount||'');
      end;

    显示游标:

    SQL> declare
      2  --定义游标类型sp_test_cursor
      3  type sp_test_cursor is ref cursor;
      4  --定义一个游标变量
      5  test_cursor sp_test_cursor;
      6  --定义变量
      7  v_name mytest.name%type;
      8  v_passwd mytest.passwd%type;
      9  begin
     10  --执行  把cursor和一个select结合
     11  open test_cursor for select name,passwd from mytest;
     12  loop
     13  fetch test_cursor into v_name,v_passwd;
     14  --跳出循环的条件即判断当前游标是否为空
     15  exit when test_cursor%notfound;
     16  dbms_output.put_line('name:'||v_name||' passwd:'||v_passwd);
     17  end loop;
     18  --关闭游标
     19  close test_cursor;
     20  end;
     21  /
     
    name:123 passwd:123
    name:gaodingle!!!! passwd:123
    name:gagaga passwd:123
    name:125555 passwd:passwd
     
    PL/SQL procedure successfully completed
     
     
    SQL> declare
      2  type sp_cursor is ref cursor;
      3  test_cursor sp_cursor;
      4  v_id mytest.id%type;
      5  v_name mytest.name%type;
      6  v_passwd mytest.passwd%type;
      7  v_salary mytest.salary%type;
      8  begin
      9  open test_cursor for select id,name,passwd,salary from mytest;
     10  loop
     11  fetch test_cursor into v_id,v_name,v_passwd,v_salary;
     12  if v_salary=100 then
     13  update mytest set salary=v_salary+50 where id=v_id;
     14  end if;
     15  exit when test_cursor%notfound;
     16  end loop;
     17  close test_cursor;
     18  end;
     19  /
     
    PL/SQL procedure successfully completed
     
    SQL> select * from mytest;
     
    ID    NAME                 PASSWD                                                                                         SALARY
    ----- -------------------- -------------------- --------------------------------------------------------------------------------
    1     123                  123                                                                                               150
    2     gaodingle!!!!        123                                                                                               150
    3     gagaga               123                                                                                               150
    4     125555               passwd                                                                                             50
     
  • 相关阅读:
    Intellij idea安装
    c# .net 我的Application_Error 全局异常抓取处理
    c# .net Global.asax文件的作用
    ASP.NET机制详细的管道事件流程(转)
    正则表达式_学习笔记
    c# .net获取随机字符串!
    c# 动态调用WCF方法笔记!
    Web Service和WCF的区别。其实二者不属于一个范畴!!!
    c# .net获取文件夹下的所有文件(多层递归),并获取区间数据(Jsion,xml等数据)写出到处理文件,学习分享~
    c#.net单例模式的学习记录!
  • 原文地址:https://www.cnblogs.com/lingyejun/p/7096663.html
Copyright © 2011-2022 走看看