ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 10036|回复: 7

[每日一题] PL/SQL Challenge 每日一题:2016-12-12 游标属性 %ISOPEN

[复制链接]
论坛徽章:
479
状元
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09
发表于 2016-12-15 05:11 | 显示全部楼层 |阅读模式
(原发表于 2011-6-3)
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者:Steven Feuerstein

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

哪些选项包含的代码块在执行之后会显示如下文本?

opened
opened already

(A)
DECLARE
   CURSOR cur
   IS
      SELECT * FROM DUAL;

   PROCEDURE show_isopen
   IS
   BEGIN
      IF cur%ISOPEN
      THEN
         DBMS_OUTPUT.put_line ('opened already');
      ELSE
         OPEN cur;

         DBMS_OUTPUT.put_line ('opened');
      END IF;
   END show_isopen;
BEGIN
   show_isopen;
   show_isopen;
END;
/

(B)
DECLARE
   PROCEDURE show_isopen
   IS
      CURSOR cur
      IS
         SELECT * FROM DUAL;
   BEGIN
      IF cur%ISOPEN
      THEN
         DBMS_OUTPUT.put_line ('opened already');
      ELSE
         OPEN cur;

         DBMS_OUTPUT.put_line ('opened');
      END IF;
   END show_isopen;
BEGIN
   show_isopen;
   show_isopen;
END;
/

(C)
DECLARE
   cur   SYS_REFCURSOR;

   PROCEDURE show_isopen
   IS
   BEGIN
      IF cur%ISOPEN
      THEN
         DBMS_OUTPUT.put_line ('opened already');
      ELSE
         OPEN cur FOR 'SELECT * FROM sys.DUAL';

         DBMS_OUTPUT.put_line ('opened');
      END IF;
   END show_isopen;
BEGIN
   show_isopen;
   show_isopen;
END;
/


(D)
DECLARE
   PROCEDURE show_isopen
   IS
      cur   SYS_REFCURSOR;
   BEGIN
      IF cur%ISOPEN
      THEN
         DBMS_OUTPUT.put_line ('opened already');
      ELSE
         OPEN cur FOR 'SELECT * FROM sys.DUAL';

         DBMS_OUTPUT.put_line ('opened');
      END IF;
   END show_isopen;
BEGIN
   show_isopen;
   show_isopen;
END;
/
论坛徽章:
479
状元
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09
 楼主| 发表于 2016-12-16 04:11 | 显示全部楼层
顶顶。

使用道具 举报

回复
论坛徽章:
15
秀才
日期:2017-01-20 11:04:31秀才
日期:2017-04-05 13:22:59秀才
日期:2017-03-02 10:35:32秀才
日期:2016-11-09 14:32:17秀才
日期:2016-11-09 14:32:49秀才
日期:2016-11-09 14:32:49秀才
日期:2016-11-09 14:32:49秀才
日期:2016-11-09 14:32:49技术图书徽章
日期:2016-11-09 14:33:08秀才
日期:2016-11-09 14:46:36
发表于 2016-12-16 09:49 | 显示全部楼层
我选AC
A,C的游标定义在存储过程之外,所以第一次执行存储过程时游标未开启,第二次执行存储过程时游标开启了,
将返回
opened
opened already

而B,D的游标定义在存储过程之内,所以第二次执行存储过程的时候游标又被重新定义了,又变成未开启状态,
将返回
opened
opened

使用道具 举报

回复
论坛徽章:
2
乌索普
日期:2016-11-28 11:16:45秀才
日期:2016-12-21 16:55:07
发表于 2016-12-16 13:50 | 显示全部楼层
看不懂,看得懂一定研究研究...

使用道具 举报

回复
论坛徽章:
8
技术图书徽章
日期:2014-01-26 13:54:38技术图书徽章
日期:2014-03-27 09:30:56技术图书徽章
日期:2014-03-31 10:50:45技术图书徽章
日期:2014-04-25 14:18:49技术图书徽章
日期:2014-05-19 11:17:53ITPUB14周年纪念章
日期:2015-10-26 17:24:11秀才
日期:2015-06-29 15:26:52秀才
日期:2015-11-11 09:48:44
发表于 2016-12-16 14:35 | 显示全部楼层
选A和C

使用道具 举报

回复
论坛徽章:
7
秀才
日期:2017-01-20 11:00:36秀才
日期:2017-01-20 11:04:31罗罗诺亚·索隆
日期:2016-12-23 09:11:49秀才
日期:2017-03-02 10:35:32技术图书徽章
日期:2017-03-02 10:36:07秀才
日期:2017-03-02 10:36:07秀才
日期:2017-03-20 13:42:20
发表于 2016-12-16 16:13 | 显示全部楼层
选项A,C正确,先定义游标,第一次执行过程前游标Cur%ISOPEN = false,接着用过程打开游标(此处游标未关闭),第二次执行过程前游标Cur%ISOPEN = true
选项B,D错误,第一次执行过程前游标Cur%ISOPEN = false,过程执行完之后游标自动关闭,第二次执行过程前游标Cur%ISOPEN = false

使用道具 举报

回复
论坛徽章:
479
状元
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09
 楼主| 发表于 2016-12-17 04:22 | 显示全部楼层
答案AC, 3楼得奖。
AC: 显式游标是在外层定义的。一旦它被打开,它在代码块剩余的执行当中都会保持打开状态,所以在第二次对show_isopen的调用中,cur%ISOPEN 返回 TRUE
B: 因为游标是在show_isopen过程中定义的,当过程终止时,它也会被ORACLE隐式关闭。因此,每次调用时  %ISOPEN 都不为真,"opened" 被显示两次。
D: 在此选项中,"opened"被显示两次。游标变量是在内层定义的,所以每当过程被执行,游标直到"OPEN cur FOR..."被执行时才打开。

使用道具 举报

回复
认证徽章
论坛徽章:
1
秀才
日期:2017-01-20 11:00:36
发表于 2016-12-18 18:20 | 显示全部楼层
学习了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表