楼主: newkid

[每日一题] PL/SQL CHALLENGE 每日一题

[复制链接]
论坛徽章:
27
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36托尼托尼·乔巴
日期:2017-10-25 16:45:57秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:302015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
发表于 2011-10-25 08:31 | 显示全部楼层
我猜全不对,没看懂E1有啥用。。。。

使用道具 举报

回复
论坛徽章:
0
发表于 2011-10-25 09:31 | 显示全部楼层
不错,不错.
学习中...

使用道具 举报

回复
论坛徽章:
11
SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:03:45红孩儿
日期:2012-12-19 11:08:17优秀写手
日期:2013-12-18 09:29:09暖羊羊
日期:2015-04-22 14:41:41
发表于 2011-10-25 13:47 | 显示全部楼层
newkid大哥,经9i、10g、11g验证,没有一个答案是对的,Steven忽悠咱?

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2011-10-25 22:25 | 显示全部楼层
我自己验证AB是对的,你那里报什么错?原来的B答案一开始DECLARE写成了ECLARE, 拷贝丢了第一个字母D, 已经改过来了。
我猜想可能又是NLS的设置,这个异常在英语环境下抛出。

A: 正确捕获-1858异常
B: 内层也定义了-1858但是没有捕获,所以外层仍然能够捕获到
C: 内层的定义在外层是不可见的,会报PLS-00201: identifier 'E2' must be declared
D: PRAGMA EXCEPTION_INIT必须和EXCEPTION定义在同一层DECLARE中: PLS-00700: PRAGMA EXCEPTION_INIT of E1 must follow declaration of its exception in the same declarative part

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2011-10-25 22:28 | 显示全部楼层
我把10-20的选项加上NLS设置,大家可以试验:

(A)
DECLARE
    e1   EXCEPTION;
    PRAGMA EXCEPTION_INIT (e1, -1858);
BEGIN
    DBMS_OUTPUT.put_line (
       TO_DATE ('13-DEC-2004 6:56 PM'
              ,  'DD-MON-YYYY HH:MI:SS', 'NLS_DATE_LANGUAGE=american'));
EXCEPTION
    WHEN e1
    THEN
       DBMS_OUTPUT.put_line ('Trapped!');
END;
/

(B)
DECLARE
    e1   EXCEPTION;
    PRAGMA EXCEPTION_INIT (e1, -1858);
BEGIN
    DECLARE
       e2   EXCEPTION;
       PRAGMA EXCEPTION_INIT (e2, -1858);
    BEGIN
       DBMS_OUTPUT.put_line (
          TO_DATE ('13-DEC-2004 6:56 PM'
                 ,  'DD-MON-YYYY HH:MI:SS', 'NLS_DATE_LANGUAGE=american'));
    END;
EXCEPTION
    WHEN e1
    THEN
       DBMS_OUTPUT.put_line ('Trapped!');
END;
/


(C)
DECLARE
    e1   EXCEPTION;
    PRAGMA EXCEPTION_INIT (e1, -1858);
BEGIN
    DECLARE
       e2   EXCEPTION;
       PRAGMA EXCEPTION_INIT (e2, -1858);
    BEGIN
       DBMS_OUTPUT.put_line (
          TO_DATE ('13-DEC-2004 6:56 PM'
                 ,  'DD-MON-YYYY HH:MI:SS', 'NLS_DATE_LANGUAGE=american'));
    END;
EXCEPTION
    WHEN e2
    THEN
       DBMS_OUTPUT.put_line ('Trapped!');
END;
/



(D)
DECLARE
    e1   EXCEPTION;
BEGIN
    DECLARE
       PRAGMA EXCEPTION_INIT (e1, -1858);
    BEGIN
       DBMS_OUTPUT.put_line (
          TO_DATE ('13-DEC-2004 6:56 PM'
                 ,  'DD-MON-YYYY HH:MI:SS', 'NLS_DATE_LANGUAGE=american'));
    END;
EXCEPTION
    WHEN e1
    THEN
       DBMS_OUTPUT.put_line ('Trapped!');
END;
/

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2011-10-25 22:35 | 显示全部楼层
2011-10-24 SYS_REFCURSOR作为过程参数的表现
作者:Steven Feuerstein
难度:中

我创建了如下的表并填充数据:
CREATE TABLE plch_tab (item VARCHAR2 (10))
/

BEGIN
   INSERT INTO plch_tab
        VALUES ('Keyboard');

   INSERT INTO plch_tab
        VALUES ('Mouse');

   COMMIT;
END;
/

然后我创建了这个函数,从游标变量取得一行数据并返回:

CREATE OR REPLACE FUNCTION plch_getitem (
   plch_cur IN SYS_REFCURSOR)
   RETURN plch_tab.item%TYPE
IS
   lvretval   plch_tab.item%TYPE;
BEGIN
   FETCH plch_cur INTO lvretval;

   RETURN lvretval;
END plch_getitem;
/

现在我需要写一个程序块来获取表里的数据行,并且显示行数和最后一行的项目名称。下面就是这个接近完成的版本:

DECLARE
   lvitem     plch_tab.item%TYPE;
   test_cur   SYS_REFCURSOR;
BEGIN
   OPEN test_cur FOR
        SELECT * FROM plch_tab ORDER BY item;

   /*FETCH*/

   DBMS_OUTPUT.put_line ('Count = ' || test_cur%ROWCOUNT);
   DBMS_OUTPUT.put_line ('Item = ' || NVL (lvitem, 'NOT SET'));

   CLOSE test_cur;
END;
/

下列的选项中哪些可用来代替 /*FETCH*/ 从而使得这个块执行之后,屏幕上可以见到如下输出?

Count = 2
Item = Mouse

(A)
FETCH test_cur INTO lvitem;
lvitem := plch_getitem (test_cur);

(B)
lvitem := plch_getitem (test_cur);
lvitem := plch_getitem (test_cur);

(C)
lvitem := plch_getitem (test_cur);
FETCH test_cur INTO lvitem;

(D)
lvitem := plch_getitem (test_cur);
FETCH plch_cur INTO lvitem;

使用道具 举报

回复
论坛徽章:
27
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36托尼托尼·乔巴
日期:2017-10-25 16:45:57秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:302015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
发表于 2011-10-26 08:26 | 显示全部楼层
实验前A,实验后。。。。果然基础太重要了

使用道具 举报

回复
论坛徽章:
11
SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:03:45红孩儿
日期:2012-12-19 11:08:17优秀写手
日期:2013-12-18 09:29:09暖羊羊
日期:2015-04-22 14:41:41
发表于 2011-10-26 08:59 | 显示全部楼层
newkid 发表于 2011-10-25 22:25
我自己验证AB是对的,你那里报什么错?原来的B答案一开始DECLARE写成了ECLARE, 拷贝丢了第一个字母D, 已经改 ...

之前一直报“无效的月份”,设置NLS为英文就没问题了。
该死的NLS,坑了我两次,上次有道题目也是要设置NLS,

使用道具 举报

回复
论坛徽章:
11
SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:03:45红孩儿
日期:2012-12-19 11:08:17优秀写手
日期:2013-12-18 09:29:09暖羊羊
日期:2015-04-22 14:41:41
发表于 2011-10-26 09:08 | 显示全部楼层
选ABC,它们都把遍历了游标里的数据,可以得到行数与最后的值
D 应该会报错“plch_cur 不存在”

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2011-10-26 22:12 | 显示全部楼层
10-24答案ABC. 答案D错误因为plch_cur这个名称在函数之外是不可见的。
REF CURSOR作为IN参数(不需要定义为IN OUT),在FETCH之后游标仍然会前移,所以你调用之后再FETCH会取到下一行。

----------------
2011-10-25 NULL与循环

作者:Vinod Kumar
难度:低
下列代码块执行之后,屏幕上会显示什么?

DECLARE
   v_number NUMBER;
BEGIN
    LOOP
       v_number := v_number + 1;
       EXIT WHEN v_number > 100;
    END LOOP;

    DBMS_OUTPUT.PUT_LINE (NVL (TO_CHAR (v_number), '*NULL*'));
END;
/

(A)
100

(B)
101

(C)
0

(D)
*NULL*

使用道具 举报

回复

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

本版积分规则 发表回复

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