楼主: newkid

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

[复制链接]
论坛徽章:
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
291#
 楼主| 发表于 2012-2-4 05:00 | 只看该作者
本帖最后由 newkid 于 2012-2-6 10:29 编辑

2012-2-1 所有答案都不对。
A: 在这个实现方案中,和循环变量无关的代码被转移到循环之外。但是这并不会提高性能,因为在plsql_optimize_level的缺省设置(值为2)或者更高设置下,PLSQL的优化器已经自动替你做了这件事。
B: 在这个实现方案中,基于parts_in集合的计算先被赋值给一个变量,然后累加。这样做不会提高性能,原因同上,PLSQL优化器已经自动把这部分代码转移出循环了。
C: 这个设置(1)比缺省值(2)更低,所以实际上性能更差了,每次循环都会进行计算。
D: 同上。
==================================
2012-2-2 日期的四舍五入
作者:Steven Feuerstein
难度:低

我创建了这个过程来显示一个日期及时间的值:

CREATE OR REPLACE PROCEDURE plch_show_date (date_in IN DATE)
IS
BEGIN
   DBMS_OUTPUT.put_line (TO_CHAR (date_in, 'YYYY-MON-DD HH24:MI:SS'));
END;
/

我需要写一个名字叫plch_start_of_day的函数,它接受一个日期型参数,不妨称为date_in,然后根据如下规则返回一个日期:

1. 如果date_in的时间部分是正午时分或者更迟(12:00:00或以后),那么函数返回值的日期部分必须是date_in+1。否则,返回值的日期部分和date_in相同。

2. 返回值的时间部分必须被设为午夜(即00:00)

下列的哪些选项实现了这样的行数,从而当我执行这个代码块时:
BEGIN
   plch_show_date (
      plch_start_of_day (
         TO_DATE ('2012-JAN-15 01:00:00', 'YYYY-MON-DD HH24:MI:SS')));
   plch_show_date (
      plch_start_of_day (
         TO_DATE ('2012-JAN-15 15:00:00', 'YYYY-MON-DD HH24:MI:SS')));
END;
/

我会看到这两行文本:
2012-JAN-15 00:00:00
2012-JAN-16 00:00:00

(A)
CREATE OR REPLACE FUNCTION plch_start_of_day (date_in IN DATE)
   RETURN DATE
IS
BEGIN
   RETURN ROUND (date_in, 'DDD');
END;
/

(B)
CREATE OR REPLACE FUNCTION plch_start_of_day (date_in IN DATE)
   RETURN DATE
IS
BEGIN
   RETURN ROUND (date_in, 'DAY');
END;
/

(C)
CREATE OR REPLACE FUNCTION plch_start_of_day (date_in IN DATE)
   RETURN DATE
IS
   c_seconds_to_noon   CONSTANT NUMBER := (24 * 60 * 60) / 2;
   c_seconds           CONSTANT NUMBER := TO_CHAR (date_in, 'SSSSS');
BEGIN
   RETURN
      CASE
         WHEN c_seconds >= c_seconds_to_noon THEN TRUNC (date_in + 1)
         ELSE TRUNC (date_in)
      END;
END;
/

(D)
CREATE OR REPLACE FUNCTION plch_start_of_day (date_in IN DATE)
   RETURN DATE
IS
BEGIN
   RETURN TRUNC (date_in);
END;
/

(E)
CREATE OR REPLACE FUNCTION plch_start_of_day (date_in IN DATE)
   RETURN DATE
IS
BEGIN
   RETURN ROUND (date_in);
END;
/

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:57:13ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
292#
发表于 2012-2-4 12:26 | 只看该作者
A、D、E

20120204115313.JPG (5.4 KB, 下载次数: 47)

20120204115313.JPG

使用道具 举报

回复
论坛徽章:
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
293#
 楼主| 发表于 2012-2-6 10:28 | 只看该作者
2012-2-2 答案 ACE
A: ROUND函数作用于日期型且带DDD作为格式参数,将会四舍五入(正午之前为舍,正午或之后为入),符合题意要求。
B: ROUND函数作用于日期型且带DAY作为格式参数,将会四舍五入(以星期三正午为界,之前为舍,正午或之后为入)到每周的周日。
C: 自己用CASE逻辑实现了题意
D: TRUNC只舍不入
E: ROUND函数作用于日期型且不带格式参数,将会四舍五入(正午之前为舍,正午或之后为入),符合题意要求。
=======================================
2012-2-3 集合去重
作者:Steven Feuerstein
难度:中

我创建了如下的类型:
CREATE OR REPLACE TYPE numbers_t IS TABLE OF NUMBER;
/

然后我写了如下代码块(未完成):
DECLARE
   l_numbers   numbers_t
                  := numbers_t (1, 2, 3, 4, 3, 5);
BEGIN
   /*REMOVEDUPS*/

   FOR rec IN (  SELECT COLUMN_VALUE
                   FROM TABLE (l_numbers)
               ORDER BY COLUMN_VALUE)
   LOOP
      DBMS_OUTPUT.put_line (rec.COLUMN_VALUE);
   END LOOP;

   DBMS_OUTPUT.put_line (l_numbers.LAST);
END;
/

哪些选项提供了一个/*REMOVEDUPS*/注释的代替品,使得代码块执行之后会显示如下文本:
1
2
3
4
5
5

(A)
l_numbers := DISTINCT (l_numbers);

(B)
l_numbers := UNIQUE (l_numbers);

(C)
l_numbers := SET (l_numbers);

(D)
DECLARE
   l_used   DBMS_SQL.number_table;
BEGIN
   FOR indx IN 1 .. l_numbers.COUNT
   LOOP
      IF l_used.EXISTS (l_numbers (indx))
      THEN
         l_numbers.delete (indx);
      ELSE
         l_used (l_numbers (indx)) := 1;
      END IF;
   END LOOP;
END;

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:57:13ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
294#
发表于 2012-2-7 10:41 | 只看该作者
ycpriscilla 发表于 2012-2-4 12:26
A、D、E

晕,想的是C写的是D...

使用道具 举报

回复
论坛徽章:
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
295#
 楼主| 发表于 2012-2-8 01:03 | 只看该作者
2012-2-3 答案C.
A,B:语法错误;D:虽然删除了重复数据,但是位置还空着。
========================================
2012-2-6
作者:Valentin Nikotin
难度:高

我创建了如下的函数:
create or replace function plch_func (i number) return number is
begin
  dbms_output.put_line('plch_func with i = '||i);
  return 1;
end;
/

下列的每个选项都包含一个代码块,它执行一个查询,查询中轮流调用这个plch_func函数。哪些选项会导致下列的两行文本被显示?(顺序无所谓)

plch_func with i = 1
plch_func with i = 2

(A)
declare
  val1 number;
  val2 number;
begin
  select plch_func(1), plch_func(2) into val1, val2
    from dual;
end;
/

(B)
begin
  for rec in (select plch_func(1), plch_func(2) from dual)
  loop
    null;
  end loop;
end;
/

(C)
begin
  execute immediate
    'select plch_func(1), plch_func(2)
       from dual';
end;
/

(D)
declare
  val1 number;
  val2 number;   
begin
  execute immediate
    'select plch_func(1), plch_func(2)
       from dual'
    into val1, val2;
end;
/

(E)
declare
  c number := dbms_sql.open_cursor;
  rc number;
begin
  dbms_sql.parse(c,
                 'select plch_func(1), plch_func(2) from dual',
                 dbms_sql.native);
  rc := dbms_sql.execute_and_fetch(c);
  dbms_sql.close_cursor(c);
end;
/


(F)
declare
  c number := dbms_sql.open_cursor;
  rc number;
begin
  dbms_sql.parse(c,
                 'select plch_func(1), plch_func(2) from dual',
                 dbms_sql.native);
  dbms_sql.define_column(c, 1, 1);
  rc := dbms_sql.execute_and_fetch(c);
  dbms_sql.close_cursor(c);
end;
/

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:57:13ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
296#
发表于 2012-2-8 09:56 | 只看该作者
A,B吧,后面实在不懂。。。帮顶

使用道具 举报

回复
论坛徽章:
0
297#
发表于 2012-2-8 13:22 | 只看该作者
ABD。不过说真心话,D是试验出来的,AB是肯定可以。但是不明白C和D之间的区别。

使用道具 举报

回复
论坛徽章:
0
298#
发表于 2012-2-8 13:44 | 只看该作者
为什么有into就能显示输出结果,没有into就不显示呢。。。求解释。。。

使用道具 举报

回复
论坛徽章:
171
ITPUB社区OCM联盟徽章
日期:2013-07-30 11:25:46最佳人气徽章
日期:2013-03-19 17:13:45ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30ITPUB季度 技术新星
日期:2012-05-22 15:10:11BLOG每日发帖之星
日期:2012-02-15 16:43:07生肖徽章2007版:马
日期:2012-03-07 10:13:26蓝锆石
日期:2012-02-24 10:13:15萤石
日期:2012-02-24 10:13:15海蓝宝石
日期:2012-02-24 10:13:15紫水晶
日期:2012-03-01 21:28:36
299#
发表于 2012-2-8 16:48 | 只看该作者
这个是好东西啊,建议弄成ptf

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
12
ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42秀才
日期:2015-08-06 10:47:08马上有房
日期:2014-11-10 19:56:59优秀写手
日期:2014-07-25 06:00:032014年世界杯参赛球队: 意大利
日期:2014-06-20 16:19:18马上有房
日期:2014-05-15 21:22:18马上有钱
日期:2014-05-05 23:16:35马上有车
日期:2014-03-09 18:57:04问答徽章
日期:2013-10-30 22:14:092013年新春福章
日期:2013-02-25 14:51:24
300#
发表于 2012-2-8 17:50 | 只看该作者
一个个的试,不过好多不懂啊

使用道具 举报

回复

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

本版积分规则 发表回复

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