知识点的梳理:
- 游标可以将指定查询记录中的数据逐行取出,每行数据单独进行处理;
-
静态游标分为两类:
-
隐式游标:在PL/SQL 块中编写的每条SQL 语句实际上是隐式游标;
- 隐式游标分为:单行隐式游标和多行隐式游标;
-
显示游标:由用户明确定义的游标;
- 显式游标有4个基本属性:%FOUND,%ISOPEN,%NOTFOUND,%ROWCOUNT;
-
- 利用FOR语句可以自动打开和关闭游标,不需要由用户手工打开;
- FOR UDPATE子句会将游标提取出来的数据进行行级锁定,使本会话更新期间,其他用户的会话不能对当前游标中的数据进行更新操作;
- 使用FOR UPDATE 子句锁定当前行之后,可以利用WHERE CURRENT OF子句进行当前行的更新或删除操作;
-
游标变量是指在游标使用时才为其设置具体的查询语句;
-
简介
-
sql编写的查询语句会将所有结果显示给用户;如果我们需要对返回结果中的每一条数据分别进行操作,可通过结果集来接收,利用游标进行操作;
- 从表中检索出结果集后,这个结果集的数据管理统一交给游标来控制;
- 游标会降低性能;
-
游标分为两类:
-
静态游标:结果集已经存在(静态定义)的游标,分为隐式和显示游标两种;
- 隐式游标:所有DML语句为隐式游标,通过它可以获取SQL语句信息;
- 显示游标:用户显示声明的游标,即指定结果集。当查询返回结果超过一行时,就需要一个显示游标;
- REF游标:动态关联结果集的临时对象;
-
-
-
隐式游标
- 在PL/SQL块中编写的每条SQL语句实际上是隐式游标;
- 示例1:通过ROWCOUNT属性,获得语句所改变的行数
DECLARE v_count NUMBER ; BEGIN SELECT COUNT(*) INTO v_count FROM dept ; -- 只返回一行结果 DBMS_OUTPUT.put_line('SQL%ROWCOUNT = '|| SQL%ROWCOUNT) ; END ; / | 运行结果: |
- 示例2:验证ROWCOUNT,增加新数据返回行数
DECLARE BEGIN INSERT INTO dept(deptno,dname,loc) VALUES (90,'MLDN','北京') ; DBMS_OUTPUT.put_line('SQL%ROWCOUNT = '|| SQL%ROWCOUNT) ; END ; / | 运行结果: |
-
" SQL%ROWCOUNT "中的SQL是一个关键字,表示的是任意的一个隐式游标,但是在PL/SQL中,对于隐式游标SQL可用的属性一共有4个,如下表:
-
单行隐式游标
- 通过SQL语句查询时,可以使用select...into这样的结构,将查询结果设置给指定的变量,返回的结果一般都是一行数据,此游标称为单行隐式游标;
- 示例1:单行隐式游标
DECLARE v_empRow emp%ROWTYPE;-- 保存emp每行记录 BEGIN SELECT * INTO v_empRow FROM emp WHERE empno=7369 ; IF SQL%FOUND THEN -- 发现数据 DBMS_OUTPUT.put_line('雇员姓名:' || v_empRow.ename || ',职位:' || v_empRow.job) ; END IF ; END ; / | 运行结果: |
-
多行隐式游标
- 主要是指更新多行数据,或者是查询返回多行数据的操作;
- 示例1:更新多行记录
BEGIN UPDATE emp SET sal=sal*1.2 ; IF SQL%FOUND THEN -- 发现数据 DBMS_OUTPUT.put_line('更新记录行数:' ||SQL%ROWCOUNT) ; ELSE DBMS_OUTPUT.put_line('没有记录被修改!') ; END IF ; END ; / | 运行结果: |
-
--
-
--
-
--
-
--
-
--
-
--
-
-
-
-
-