楼主: newkid

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

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
61#
 楼主| 发表于 2011-10-19 22:25 | 只看该作者
2011-10-17 答案 CD
对记录类型不能使用IS NOT NULL判断,否则会出现:
PLS-00306: wrong number or types of arguments in call to 'IS NOT NULL'
这导致AB出现异常。
Steven Feuerstein建议你采用D的做法以便于重用代码。

2011-10-18: TO_CHAR格式
作者:        Steven Feuerstein
难度:中

我的经理叫我写一个函数,这个函数接受一个正整数并返回相应的序数(比如,2->2nd,  145->145th), 这个序数是一个字符串。这个函数只接受1和50,000之间的整数。


下列的哪些选项实现了函数plch_n_to_nth, 从而使得它满足上述需求,在下列块被执行之后:

BEGIN
   DBMS_OUTPUT.put_line (plch_n_to_nth (1));
   DBMS_OUTPUT.put_line (plch_n_to_nth (8));
   DBMS_OUTPUT.put_line (plch_n_to_nth (256));
   DBMS_OUTPUT.put_line (plch_n_to_nth (25763));
END;
/

我能见到如下输出:

1st
8th
256th
25763rd

英语序数词定义可参见:
http://en.wikipedia.org/wiki/English_numerals#Ordinal_numbers

(A)
CREATE OR REPLACE FUNCTION plch_n_to_nth (n_in IN INTEGER)
   RETURN VARCHAR2
IS
BEGIN
   RETURN TO_CHAR (n_in, '9999th');
END;
/

(B)
CREATE OR REPLACE FUNCTION plch_n_to_nth (n_in IN INTEGER)
   RETURN VARCHAR2
IS
BEGIN
   RETURN LOWER (
             TO_CHAR (
                TO_DATE ('1-1-' || n_in, 'dd-mm-yyyy')
              ,  'FMYYYYth'));
END;
/

(C)
CREATE OR REPLACE FUNCTION plch_n_to_nth (n_in IN INTEGER)
   RETURN VARCHAR2
IS
BEGIN
   RETURN LOWER (
             TO_CHAR (
                TO_DATE ('1-1-2011 ' || n_in
                       ,  'dd-mm-yyyy SSSSS')
              ,  'FMSSSSSth'));
END;
/

(D)
CREATE OR REPLACE FUNCTION plch_n_to_nth (
   n_in IN INTEGER)
   RETURN VARCHAR2
IS
   c_last_digit   CONSTANT PLS_INTEGER
                              := MOD (n_in, 10) ;
   c_tens_digit   CONSTANT CHAR (1)
      := SUBSTR ('0' || TO_CHAR (n_in), -2, 1) ;
BEGIN
   RETURN    TO_CHAR (n_in)
          || CASE
                WHEN c_tens_digit = '1' THEN 'th'
                WHEN c_last_digit = 1 THEN 'st'
                WHEN c_last_digit = 2 THEN 'nd'
                WHEN c_last_digit = 3 THEN 'rd'
                ELSE 'th'
             END;
END plch_n_to_nth;
/

使用道具 举报

回复
论坛徽章:
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
62#
发表于 2011-10-20 09:35 | 只看该作者
TO_CHAR 用法真是太多了

使用道具 举报

回复
论坛徽章:
39
嫦娥
日期:2015-08-26 10:44:22托尼托尼·乔巴
日期:2019-12-17 00:46:1120周年集字徽章-20	
日期:2020-10-28 14:59:27
63#
发表于 2011-10-20 10:44 | 只看该作者
测试结果
2011-10-18: CD
压根没想到这个方法

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
64#
 楼主| 发表于 2011-10-21 22:07 | 只看该作者
2011-10-19 答案:D
(A)
这个选项的结果是:
100
200
ERROR
这是因为我关闭C1之后,C2也会被关闭,所以第三个FETCH会抛出"ORA-01001: invalid cursor"异常。

(B)
同上,只要C1,C2其中一个被关闭,另一个就相应被关闭。

(C)
这个选项的结果是:
100
200
300
ERROR

既然我在三个FETCH结束前没有关闭游标,我就能看到100-300。但是随后我关闭了C1, 而且还试图关闭C2。C1一旦被关闭,C2也自动被关闭,因此假如试图再关闭C2就会报"ORA-01001: invalid cursor"错误。

(D)正确

======================================
2011-10-20 %TYPE的使用
作者:Steven Feuerstein
难度:中

我创建了这些类型和表:

CREATE TYPE plch_food_t AS OBJECT (name VARCHAR2 (100));
/

CREATE or replace TYPE plch_food_nt
   IS TABLE OF VARCHAR2 (100)
/

CREATE TABLE plch_food (name VARCHAR2 (100))
/

CREATE OR REPLACE PACKAGE plch_pkg
IS
   TYPE food_rt IS RECORD (name VARCHAR2 (100));
END;
/

下面的哪些选项在执行之后将会显示"Brussels Sprouts"?

(A)
DECLARE
   l_var   plch_food.name%TYPE := 'Brussels Sprouts';
BEGIN
   DBMS_OUTPUT.put_line (l_var);
END;
/

(B)
DECLARE
   l_var   plch_food_nt%TYPE := 'Brussels Sprouts';
BEGIN
   DBMS_OUTPUT.put_line (l_var);
END;
/

(C)
DECLARE
   l_var   plch_food_t.name%TYPE := 'Brussels Sprouts';
BEGIN
   DBMS_OUTPUT.put_line (l_var);
END;
/

(D)
DECLARE
   l_var   plch_pkg.food_rt.name%TYPE := 'Brussels Sprouts';
BEGIN
   DBMS_OUTPUT.put_line (l_var);
END;
/

使用道具 举报

回复
论坛徽章:
39
嫦娥
日期:2015-08-26 10:44:22托尼托尼·乔巴
日期:2019-12-17 00:46:1120周年集字徽章-20	
日期:2020-10-28 14:59:27
65#
发表于 2011-10-23 11:00 | 只看该作者
2011-10-20   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
66#
发表于 2011-10-24 09:01 | 只看该作者
D为什么不行呢?
BC的提示说“%type用于变量、列、字段或属性”,我试过了变量、列,确实可以。按说,plch_pkg.food_rt.name是属性,应该可以啊?

使用道具 举报

回复
论坛徽章:
24
萤石
日期:2013-01-03 16:13:11海蓝宝石
日期:2013-04-23 17:06:35红宝石
日期:2013-05-17 17:32:35SQL大赛参与纪念
日期:2013-12-06 14:03:45马上有对象
日期:2014-02-18 16:44:08马上有车
日期:2014-02-27 15:22:45优秀写手
日期:2014-03-22 06:00:12马上有房
日期:2014-03-26 19:40:00巨蟹座
日期:2015-10-18 17:42:41
67#
发表于 2011-10-24 13:36 | 只看该作者
  MARK  好 东西

使用道具 举报

回复
论坛徽章:
7
生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2009-07-06 17:45:042009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:07:212011新春纪念徽章
日期:2011-02-18 11:42:47
68#
发表于 2011-10-24 20:39 | 只看该作者
需要多加练习了。。。。。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
69#
 楼主| 发表于 2011-10-24 22:48 | 只看该作者
本帖最后由 newkid 于 2011-10-25 22:19 编辑

2011-10-20 答案 A

D为什么不行?你不能对记录类型直接使用%TYPE, 必须先声明一个基于该记录类型的变量,然后对这个变量使用%TYPE:

DECLARE
   l_food   plch_pkg.food_rt;
   l_var    l_food.name%TYPE := 'Brussels Sprouts';
BEGIN
   DBMS_OUTPUT.put_line (l_var);
END;
/

=================================================
2011-10-21:
作者:        Steven Feuerstein
难度:中

下列的哪些程序块在执行之后会显示:"Trapped!"

注意:当你试图把字符串 "13-DEC-2004 6:56 PM" 使用掩码 "DD-MON-YYYY HH:MI:SS" 转换成日期型时,Oracle 会抛出 ORA-01858 错误。

(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'));
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'));
   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'));
   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'));
   END;
EXCEPTION
   WHEN e1
   THEN
      DBMS_OUTPUT.put_line ('Trapped!');
END;
/

使用道具 举报

回复
论坛徽章:
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
70#
发表于 2011-10-25 08:31 | 只看该作者
我猜全不对,没看懂E1有啥用。。。。

使用道具 举报

回复

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

本版积分规则 发表回复

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