楼主: newkid

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

[复制链接]
论坛徽章:
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
91#
发表于 2011-10-30 18:31 | 只看该作者
ACD
B错,因为常量初始化后不能再被赋值

使用道具 举报

回复
论坛徽章:
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
92#
 楼主| 发表于 2011-10-31 02:49 | 只看该作者
2011-10-27 答案CD. ORACLE只对嵌套表(NESTED TABLE)和可变数组(VARRAY)提供构造函数(constructor function), ASSOCIATED ARRAY (即INDEX BY表)则没有这个构造函数,必须采用自定义函数。常量在声明的部分必须赋值,不能够在块中赋值。

======================================
2011-10-28 LIKE条件中的通配符
作者:Marc Thompson
难度:低

我创建了这张表并填入数据:
CREATE TABLE plch_new_parts
(
   partnum    NUMBER
, partname   VARCHAR2 (50)
)
/

BEGIN
   INSERT INTO plch_new_parts (partnum, partname)
        VALUES (1, 'MY PART NUMBER 1');

   INSERT INTO plch_new_parts (partnum, partname)
        VALUES (2, 'MY_PART_NUMBER_2');

   INSERT INTO plch_new_parts (partnum, partname)
        VALUES (3, 'MY_PART NUMBER_3');

   COMMIT;
END;
/

当我执行下列这段代码,屏幕上会显示什么?
DECLARE
   l_counts   DBMS_SQL.number_table;

BEGIN
   l_counts (1) := 0;
   l_counts (2) := 0;
   l_counts (3) := 0;
   l_counts (4) := 0;

   FOR rec IN (  SELECT partname
                   FROM plch_new_parts
               ORDER BY partnum)
   LOOP
      IF rec.partname LIKE 'MY PART NUMBER %'
      THEN
         l_counts (1) := l_counts (1) + 1;
      END IF;

      IF rec.partname LIKE 'MY_PART_NUMBER_%'
      THEN
         l_counts (2) := l_counts (2) + 1;
      END IF;

      IF rec.partname LIKE 'MY_PART NUMBER_%'
      THEN
         l_counts (3) := l_counts (3) + 1;
      END IF;

      IF rec.partname LIKE 'MY?PART?NUMBER?*'
      THEN
         l_counts (4) := l_counts (4) + 1;
      END IF;
   END LOOP;

   FOR indx IN 1 .. l_counts.COUNT
   LOOP
      DBMS_OUTPUT.put_line (l_counts (indx));
   END LOOP;
END;
/

(A)
1
1
1
0

(B)
1
3
2
0

(C)
0
0
0
3


(D)
3
3
3
3

(E)
1
3
2
3

使用道具 举报

回复
论坛徽章:
39
嫦娥
日期:2015-08-26 10:44:22托尼托尼·乔巴
日期:2019-12-17 00:46:1120周年集字徽章-20	
日期:2020-10-28 14:59:27
93#
发表于 2011-10-31 10:23 | 只看该作者
2011-10-28  B

使用道具 举报

回复
论坛徽章:
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
94#
发表于 2011-10-31 12:52 | 只看该作者
B

'MY?PART?NUMBER?*' 这个是用来忽悠人的吧

使用道具 举报

回复
论坛徽章:
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
95#
 楼主| 发表于 2011-10-31 23:50 | 只看该作者
2011-10-28答案B.
_匹配单个字符,%匹配任意个字符,*和?是忽悠人的。

使用道具 举报

回复
论坛徽章:
1
复活蛋
日期:2012-05-29 10:37:04
96#
发表于 2011-11-1 17:30 | 只看该作者
学习了

使用道具 举报

回复
论坛徽章:
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
97#
 楼主| 发表于 2011-11-1 21:50 | 只看该作者
2011-10-31 对集合的密集性判断

作者:Steven Feuerstein
难度:中

我创建了这个工具函数来显示一个布尔型变量的值:
CREATE OR REPLACE PROCEDURE plch_bpl (val IN BOOLEAN)
IS
BEGIN
   DBMS_OUTPUT.put_line (
      CASE val WHEN TRUE THEN 'TRUE' WHEN FALSE THEN 'FALSE' ELSE 'NULL' END);
END plch_bpl;
/

下列的选项中都包含了下面这个函数的实现代码:
CREATE OR REPLACE FUNCTION plch_is_dense (numbers_in IN DBMS_SQL.number_table)
   RETURN BOOLEAN

我写了另一个帮助过程来测试这个 plch_is_dense 函数:
CREATE OR REPLACE PROCEDURE plch_test_is_dense
IS
   l_numbers   DBMS_SQL.number_table;
BEGIN
   l_numbers (1000) := 1;
   l_numbers (3000) := 1;
   plch_bpl (plch_is_dense (l_numbers));
   l_numbers.delete;
   l_numbers (2) := 1;
   l_numbers (3) := 1;
   plch_bpl (plch_is_dense (l_numbers));
END;
/

哪些选项创建的plch_is_dense使得plch_test_is_dense在执行之后会显示这两行文本?
FALSE
TRUE

(A)
IS
BEGIN
   RETURN numbers_in.COUNT = (numbers_in.LAST - numbers_in.FIRST);
END;



(B)
IS
   l_number   NUMBER;
BEGIN
   FOR indx IN numbers_in.FIRST .. numbers_in.LAST
   LOOP
      l_number := numbers_in (indx);
   END LOOP;

   RETURN TRUE;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      RETURN FALSE;
END;

(C)
IS
   l_number   NUMBER;
BEGIN
   FOR indx IN 1 .. numbers_in.COUNT
   LOOP
      l_number := numbers_in (indx);
   END LOOP;

   RETURN TRUE;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      RETURN FALSE;
END;

(D)
IS
BEGIN
   RETURN numbers_in.COUNT = (numbers_in.LAST - numbers_in.FIRST + 1);
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
98#
发表于 2011-11-2 11:05 | 只看该作者
看代码马虎了,居然把=想成了赋值。。。。。。。。。

使用道具 举报

回复
论坛徽章:
4
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56奥运会纪念徽章:游泳
日期:2012-06-26 23:39:12奥运会纪念徽章:射击
日期:2012-10-13 09:30:32
99#
发表于 2011-11-2 17:09 | 只看该作者
学习 学习

使用道具 举报

回复
论坛徽章:
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
100#
 楼主| 发表于 2011-11-2 23:09 | 只看该作者
10-31答案BD. 对于非密集型的COLLECTION访问不能从1开始,而是要用FIRST方法。访问不存在的元素会引发NO_DATA_FOUND异常。

=============================================
2011-11-1 求嵌套表平均值

作者:Steven Feuerstein
难度:中

我创建了一个SCHEMA级别的NUMBER型嵌套表:
CREATE OR REPLACE TYPE plch_numbers_t IS TABLE OF NUMBER
/

哪些选雄实现了一个名字为plch_avg的函数,能够计算一个上述嵌套表中所有元素的平均值,从而使得下列代码块执行之后会显示"3.5"?
DECLARE
   l_numbers   plch_numbers_t
                  := plch_numbers_t (1, 2, 3, 4, 5, 6);
BEGIN
   DBMS_OUTPUT.put_line (plch_avg (l_numbers));
END;
/

(A)
CREATE OR REPLACE FUNCTION plch_avg (numbers_in IN plch_numbers_t)
   RETURN NUMBER
IS
   l_index   PLS_INTEGER := numbers_in.FIRST;
   l_sum     NUMBER := 0;
BEGIN
   WHILE l_index IS NOT NULL
   LOOP
      l_sum := l_sum + numbers_in (l_index);
      l_index := numbers_in.NEXT (l_index);
   END LOOP;

   RETURN l_sum / numbers_in.COUNT;
END;
/

(B)
CREATE OR REPLACE FUNCTION plch_avg (numbers_in IN plch_numbers_t)
   RETURN NUMBER
IS
   l_average   NUMBER;
BEGIN
   SELECT AVG (COLUMN_VALUE) INTO l_average
     FROM TABLE (numbers_in);
   RETURN l_average;
END;
/

(C)
CREATE OR REPLACE FUNCTION plch_avg (numbers_in IN plch_numbers_t)
   RETURN NUMBER
IS
BEGIN
   RETURN AVG (numbers_in);
END;
/

(D)
CREATE OR REPLACE FUNCTION plch_avg (numbers_in IN plch_numbers_t)
   RETURN NUMBER
IS
   l_index   PLS_INTEGER := numbers_in.FIRST;
   l_average     NUMBER := 0;
BEGIN
   WHILE l_index IS NOT NULL
   LOOP
      l_average := l_average + numbers_in (l_index)/numbers_in.count;
      l_index := numbers_in.NEXT (l_index);
   END LOOP;

   RETURN l_average;
END;
/

(E)
CREATE OR REPLACE FUNCTION plch_avg (numbers_in IN plch_numbers_t)
   RETURN NUMBER
IS
   l_average   NUMBER;
BEGIN
   SELECT AVG (numbers_in(ROWNUM)) INTO l_average
     FROM numbers_in;

   RETURN l_average;
END;
/

使用道具 举报

回复

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

本版积分规则 发表回复

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