ORACLE下的游标操作
 
游标是sql的一个内存工作区,由系统或者用户以变量的形式定义。游标的作用是用于临时存储从数据库中提取的数据块。游标有静态游标、动态游标之分,静态游标又可分为隐式游标和显式游标。静态游标是在编译时期就决定了结果集的,不能传递参数,而动态游标是可以通过在运行期间传递参数来获取数据结果集的。
 
游标的属性如下:
 
|   隐式游标的属性   | 
|   SQL%ROWCOUNT(整型)   |   代表dml语句成功执行的数据行数   | 
|   SQL%FOUND(布尔值)   |   判断增删改查操作是否操作成功   | 
|   SQL%NOTFOUND(布尔值)   |   判断增删改查操作是否操作成功   | 
|   SQL%ISOPEN(布尔值)   |   DML语句在执行过程中为真,结束后为假   | 
 
 
1.隐式游标
 
隐式游标是数据库系统自动打开和关闭的,不需要控制,一次只能获取一条数据,例如使用select(查询记录数),update,insert,delete等语句时。隐式游标一般用于根据操作语句对应的游标属性来了解操作的状态和结果,从而达到流程的控制。
 
接下来介绍一下隐式游标的使用
 
|   -- 判断update是否执行成功,成功则提交事务  BEGIN      UPDATE person SET name='zhangsan'; where id=1      IF SQL%FOUND THEN         COMMIT;         dbms_output.put_line('success');      ELSE         dbms_output.put_line('failed');      END IF  END;  -- 判断影响的行数  DECLARE      rowCount INT;  BEGIN      UPDATE person SET name='aaa';      rowRount:=SQL%ROWCOUNT;      dbms_output.put_line('rowRount='|| rowRount);  END;   | 
2.显示游标
 
从数据库中提取多行数据时要放到显式游标中存储。使用显示游标大致分为五步,使用CURSOR定义显示游标如下:
 
|   1、定义游标   |   Cursor cursor_name IS   | 
|   2、打开游标   |   OPEN cursor_name   | 
|   3、操作游标   |   FETCH cursor_name INTO somVar   | 
|   4、判断游标是否获取到行值   |   cursor_name%NOTFOUND;   | 
|   5、关闭游标   |   CLOSE cursor_name   | 
看一个具体的实例
 
|   将一个表中的数据放到两个数据表中  DECLARE      t_id int;      t_name varchar2;      t_sex char(1);  --定义游标  CURSOR teacher_cur IS SELECT tid,name,sex FROM teacher WHERE tid<=26;  BEGIN      --打开游标      OPEN teacher_cur;      LOOP      --提取游标          FETCH teacher_cur INTO t_id, t_name,t_sex;          --一定要退出循环          EXIT WHEN NOT teacher_cur%FOUND;          IF teacher_sex='M' THEN               一插入数据到表               COMMIT;          ELSE      -- 插入数据到表二      COMMIT;  END IF;  END LOOP;  IF teacher_cur%ISOPEN THEN  --关闭游标  CLOSE teacher_cur;  END IF  END;   | 
3.动态游标
 
ref cursor(动态游标)是可以通过在运行期间传递参数来获取数据结果集的,动态游标使用REF CURSOR进行定义。
 
|   DECLARE      --指定动态游标类型      TYPE cursor_type IS REF CURSOR;      myCursor cursor_type;--游标类型      v_sql VARCHAR2(200);      v_person person%ROWTYPE;  BEGIN      --定义动态的sql语句      v_sql:='select * from person where pname LIKE ‘‘%m%’’';      --打开游标      OPEN myCursor FOR v_sql;      LOOP           --提取游标           FETCH myCursor INTO v_person;           --停止循环           EXIT WHEN myCursor%NOTFOUND;           dbms_output.put_line (v_person.id);       END LOOP;       EXCEPTION           WHEN OTHERS THEN           CLOSE myCursor;       IF myCursor%ISOPEN THEN           CLOSE myCursor;  END IF;  END;   |