博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 11g Release 1 (11.1) 游标——SQL 游标(隐式)
阅读量:7236 次
发布时间:2019-06-29

本文共 2168 字,大约阅读时间需要 7 分钟。

 

本文内容

  • SQL 游标属性
  • 使用指南

SQL 游标由 PL/SQL 自动管理。你不用写代码来处理这些游标。你可以通过 SQL 游标的属性来追踪一个游标的执行信息。

本文示例使用的表,位于 Oracle OE Schema 示例。另外,示例在 SQL*PLUS 下运行。示例最后 "/" 符号可让 SQL*PLUS 编译代码;而在 PL/SQL Developer 下则可有可无。

SQL 游标属性


SQL 游标的属性返回 DML 和 DDL 语句的执行信息,如 INSERTUPDATEDELETESELECT INTOCOMMITROLLBACK 语句。游标的属性是 %FOUND、%ISOPEN%NOTFOUND%ROWCOUNT。游标属性的值总是引用最近执行的 SQL 语句。在数据库打开 SQL 游标前,它们的属性为 NULL。SQL 游标的另一个属性 %BULK_ROWCOUNT 是为 FORALL 语句设计的。参考 。

%FOUND 属性:一个 DML 语句改变了行?

一个 SQL 数据操纵语句执行前,%FOUND 为 NULL。之后,若一个 INSERTUPDATEDELETE 语句影响一个或多个行,或一个返回一个或多个行的 SELECT INTO 语句,则 %FOUND 为 TRUE;否则为 FALSE。

示例 1:演示 SQL%FOUND。若删除成功,则插入一行。

CREATE TABLE dept_temp AS SELECT * FROM departments;
DECLARE
dept_no NUMBER(4) := 270;
BEGIN
DELETE FROM dept_temp WHERE department_id = dept_no;
IF SQL%FOUND THEN
-- delete succeeded
INSERT INTO dept_temp VALUES (270, 'Personnel', 200, 1700);
END IF;
END;
/
%ISOPEN 属性:对 SQL 游标一直为 FALSE

当与 SQL 语句相关的游标执行后,数据库会自动关闭 SQL 游标。因为是自动关闭,所以 %ISOPEN 总为 FALSE。

%NOTFOUND 属性:一个 DML 语句没有改变行?

%NOTFOUND%FOUND 相反。

若一个 INSERTUPDATEDELETE 语句没有影响任何行,或一个没有返回行的 SELECT INTO 语句,则 %NOTFOUND 为 TRUE;否则为 FALSE。

%ROWCOUNT 属性:受影响的行有多少?

%ROWCOUNT 为一个受 INSERTUPDATEDELETE 语句,或 SELECT INTO 语句影响的行的数量。

若一个 INSERTUPDATEDELETE 语句,或 SELECT INTO 语句没有影响任何行,则 %ROWCOUNT 为 0。

示例 2:演示 SQL%ROWCOUNT。演示 %ROWCOUNT 返回删除行的数量。

CREATE TABLE employees_temp AS SELECT * FROM employees;
DECLARE
mgr_no NUMBER(6) := 122;
BEGIN
DELETE FROM employees_temp WHERE manager_id = mgr_no;
DBMS_OUTPUT.PUT_LINE('Number of employees deleted: ' ||
TO_CHAR(SQL%ROWCOUNT));
END;
/

输出:

Number of employees deleted: 8

SELECT INTO 语句返回多个行,则 PL/SQL 产生预定义异常 TOO_MANY_ROWS,%ROWCOUNT 为 1,并不是满足查询真实的数据行的数量。

SQL%ROWCOUNT 的值从 PL/SQL 引用最近执行的 SQL 语句。为之后的使用保存属性的值,并把该值立刻分配给一个本地变量。

SQL%ROWCOUNT 属性与一个事务的状态无关。当回滚到保存点完成时,SQL%ROWCOUNT 的值不能恢复到保存点之前的原始值。另外,当一个匿名事务退出时,SQL%ROWCOUNT 在父事务中不能被恢复到原来的值。

 

使用指南


当使用 SQL 游标的属性时,考虑:

  • 无论 SQL 语句在哪里执行,游标属性的值总是引用最近执行的 SQL 语句。语句可能位于不同的作用域,如在一个子块。为之后的使用保存属性值,把该值立刻分配给一个本地变量。其他操作,如子程序调用,可能会改变该变量的值。
  • %NOTFOUND 属性与 SELECT INTO 语句结合是意义的。

若一个 SELECT INTO 语句没有返回行,则 PL/SQL 立即产生预定义的异常 NO_DATA_FOUND,检查 %NOTFOUND 后,中断控制流。

一个调用 SQL 聚合函数的 SELECT INTO 语句总是返回一个值或 null。执行这样的语句后,%NOTFOUND 总是返回 FALSE,因此没必要检查。

o_r_%E7%BF%BB%E8%AF%91.jpg

o_%E5%8E%9F%E5%88%9B.jpg

转载地址:http://hpofm.baihongyu.com/

你可能感兴趣的文章
自学android半年,已从.net转型成android程序员,分享下这个过程
查看>>
ImageView显示网络图片
查看>>
linux防止sshd被爆破(安装denyhosts)
查看>>
【P4语言学习】Parser解析器
查看>>
python问题:AttributeError: 'module' object has no attribute 'SSL_ST_INIT'(转)
查看>>
测试人员职业规划
查看>>
Twenty Newsgroups Classification任务之二seq2sparse(3)
查看>>
教育单元测试mock框架优化之路(中)
查看>>
网易老司机:网络性能问题该怎样监控与定位?
查看>>
为什么LinkedIn放弃MySQL slowlog,转用基于网络层的慢查询分析器?
查看>>
何小鹏:跟李斌赌输了 将付一辆ES8顶配的购车款给对方
查看>>
OPPO R11继续升温,8月8日将推出巴萨定制机
查看>>
从主流厂商宣传语看中国CRM领域的发展
查看>>
腾讯动漫回应停止支付作者稿酬传闻:均会按时如数支付
查看>>
卫健委:保障病人就医需求 加强流感药品物资保障
查看>>
因无力偿还网贷 内蒙古一对夫妻贩卖亲生龙凤胎
查看>>
2018年深圳出口规模续称雄 新业态进出口倍增
查看>>
第二届EmTech China 峰会在京举行 畅谈科技创新未来
查看>>
证监会对6宗内幕交易案件作出行政处罚 涉及现代制药等
查看>>
张近东智慧零售大开发加码:2019年开店15000家
查看>>