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

[复制链接]
查看11 | 回复7 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
(原发表于 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;
/

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
顶顶。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
我选AC
A,C的游标定义在存储过程之外,所以第一次执行存储过程时游标未开启,第二次执行存储过程时游标开启了,
将返回
opened
opened already
而B,D的游标定义在存储过程之内,所以第二次执行存储过程的时候游标又被重新定义了,又变成未开启状态,
将返回
opened
opened
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
看不懂,看得懂一定研究研究...
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
选A和C
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
选项A,C正确,先定义游标,第一次执行过程前游标Cur%ISOPEN = false,接着用过程打开游标(此处游标未关闭),第二次执行过程前游标Cur%ISOPEN = true
选项B,D错误,第一次执行过程前游标Cur%ISOPEN = false,过程执行完之后游标自动关闭,第二次执行过程前游标Cur%ISOPEN = false
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案AC, 3楼得奖。
AC: 显式游标是在外层定义的。一旦它被打开,它在代码块剩余的执行当中都会保持打开状态,所以在第二次对show_isopen的调用中,cur%ISOPEN 返回 TRUE
B: 因为游标是在show_isopen过程中定义的,当过程终止时,它也会被ORACLE隐式关闭。因此,每次调用时%ISOPEN 都不为真,"opened" 被显示两次。
D: 在此选项中,"opened"被显示两次。游标变量是在内层定义的,所以每当过程被执行,游标直到"OPEN cur FOR..."被执行时才打开。

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
学习了。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行