楼主: 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
241#
发表于 2011-12-23 12:36 | 只看该作者
d

使用道具 举报

回复
论坛徽章:
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
242#
发表于 2011-12-23 12:47 | 只看该作者
本帖最后由 gyhgood 于 2011-12-23 13:03 编辑

挨个运行了一边终于明白其中奥妙了

使用道具 举报

回复
论坛徽章:
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
243#
 楼主| 发表于 2011-12-24 02:45 | 只看该作者
2011-12-21 答案AE
A: 第一个参数为字符串,因此随后的2,3,4也都被转换为字符串,比较之下'111'最小
B: 2,3,4前面都有空格,空格的ASCII码比'1'小,因此'111'不是最小
C: 参数全部为NUMBER型,此时111不是最小。
D: 第一个参数是NUMBER型,随后的参数也都会被转换成NUMBER再比较,因此结果同C
E: 全部都是字符串比较,'111'最小
---------------------------------------------------
2011-12-22 嵌套表的初始化
作者:Steven Feuerstein     
难度:中

我写了下面的代码来将一个集合的偶数位置的元素拷贝到另一个集合:

1  DECLARE
2     TYPE numbers_t IS TABLE OF NUMBER
3                          INDEX BY PLS_INTEGER;
4
5     l_numbers1   numbers_t;
6     l_numbers2   numbers_t;
7  BEGIN
8     l_numbers1 (1) := 100;
9     l_numbers1 (2) := 200;
10     l_numbers1 (3) := 300;
11     l_numbers1 (4) := 400;
12
13     FOR indx IN 1 .. l_numbers1.COUNT
14     LOOP
15        IF MOD (indx, 2) = 0
16        THEN
17           l_numbers2 (l_numbers2.COUNT + 1) :=
18              l_numbers1 (indx);
19        END IF;
20     END LOOP;
21
22     DBMS_OUTPUT.put_line (l_numbers2.COUNT);
23* END;

然后我将第三行代码用一个分号取代之。(意思即删除 INDEX BY PLS_INTEGER)下列的每个选项描述了对这个代码块的一个修改。请选择所有必需的选项使得修改过的代码运行之后显示"2"

注意:和平常的PL/SQL测验题不同,这些选项之间并不是无关的。换而言之,单一的选项不足以完成任务,而有些选项和结果毫无关系。
(意思即选中的各个答案必须同时应用才能达到效果)

(A)
把第13行的
l_numbers1.COUNT
换成:
l_numbers1.LAST

(B)
把第6行的
l_numbers2   numbers_t;

换成:
l_numbers2   numbers_t := numbers_t (100,200,300,400);

(C)
在第17之前插入这个:
l_numbers2.EXTEND;

(D)
把第17行的
l_numbers2.COUNT + 1

换成:
l_numbers2.LAST


(E)
把第17行的
l_numbers2.COUNT + 1

换成:
l_numbers2.LAST + 1


(F)
在第5行的 ";" 之前加入下列赋值语句:
:= numbers_t (100,200,300,400)

删除第8行到第11行。

(G)
把第6行的
l_numbers2   numbers_t;

换成:
l_numbers2   numbers_t := numbers_t();

使用道具 举报

回复
论坛徽章:
5
2012新春纪念徽章
日期:2012-01-04 11:57:56迷宫蛋
日期:2012-06-11 15:34:58复活蛋
日期:2013-01-09 09:52:09复活蛋
日期:2013-01-24 10:13:162013年新春福章
日期:2013-02-25 14:51:24
244#
发表于 2011-12-24 16:22 | 只看该作者
cfg?

使用道具 举报

回复
论坛徽章:
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
245#
发表于 2011-12-26 08:37 | 只看该作者
newkid 发表于 2011-12-24 02:45
2011-12-21 答案AE
A: 第一个参数为字符串,因此随后的2,3,4也都被转换为字符串,比较之下'111'最小
B: 2 ...

可以简单说一下字符串比较的原理吗?为什么同符串‘111’会比‘2’小?难道只比较第一位后面两位就忽略了吗?我目前是这么理解的不知道对不对

使用道具 举报

回复
论坛徽章:
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
246#
 楼主| 发表于 2011-12-27 09:40 | 只看该作者
niuxxf 发表于 2011-12-26 10:43
我非专业的解释一下,既然是字符串,那跟数字就没有任何关系,字符串只关注第一个字符。跟你一起关注专业 ...

不能说只关注第一个字符,而是从第一个开始逐个比较,如果分出大小就停止,如果还想等就再比下一个,直到分出大小。就像字典的排序。

使用道具 举报

回复
论坛徽章:
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
247#
 楼主| 发表于 2011-12-27 09:56 | 只看该作者
2011-12-22 答案CDFG

第三行删去之后,numbers_t变成了一个嵌套表,必须初始化之后才能使用。
C: 嵌套表在扩大的时候必须调用EXTEND函数。
D: 原来的l_numbers2.COUNT + 1是不对的,嵌套表不能够直接使用超出COUNT的元素。必须配合C答案先扩展,此时然后对最后一个元素即 l_numbers2 (l_numbers2.COUNT ) 或 l_numbers2 (l_numbers2.LAST) 进行赋值。
F: 变量l_numbers1必须调用构造函数numbers_t()进行初始化。既然初始化已经赋值,就没必要再单独对每个元素赋值。
G: 同上,变量l_numbers2也必须调用构造函数numbers_t()进行初始化,然后才能访问。
==================================================
2011-12-23 日期常量
作者:Steven Feuerstein
难度:低

我在当前会话执行了这个语句:
ALTER SESSION SET nls_date_format = 'MM-DD-YYYY'
/

哪些选项在执行之后会显示 "12-30-2011" ?

(A)
BEGIN
   DBMS_OUTPUT.put_line (DATE '12-30-2011');
END;
/

(B)
BEGIN
   DBMS_OUTPUT.put_line (DATE '2011-12-30');
END;
/

(C)
BEGIN
   DBMS_OUTPUT.put_line (TO_DATE ('12-30-2011'));
END;
/

(D)
BEGIN
   DBMS_OUTPUT.put_line (DATE '2011-30-12');
END;
/

(E)
BEGIN
   DBMS_OUTPUT.put_line (
      TO_DATE ('2011-30-12', 'YYYY-DD-MM'));
END;
/

(F)
DECLARE
   l_my_date   VARCHAR2 (10) := '2011-12-30';
BEGIN
   DBMS_OUTPUT.put_line (DATE l_my_date);
END;
/

(G)
BEGIN
   DBMS_OUTPUT.put_line (DATE q'[2011-12-30]');
END;
/

使用道具 举报

回复
论坛徽章:
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
248#
 楼主| 发表于 2011-12-29 02:20 | 只看该作者
本帖最后由 newkid 于 2011-12-30 04:00 编辑

2011-12-23 答案BCEG.
注意C是不推荐做法,因为它是一个隐式转换,取决于会话的nls_date_format当前设置。G是一种称为q-quote的字符串常量的写法。
---------------------------------------------------
2011-12-26
作者:Steven Feuerstein     
难度:中

我成功地执行了下列语句:
CREATE OR REPLACE FUNCTION plch_function (n   IN NUMBER
                                        , d   IN DATE)
   RETURN VARCHAR2
   DETERMINISTIC
IS
BEGIN
   RETURN TO_CHAR (n) || '-' || TO_CHAR (d);
END;
/

CREATE TABLE plch_parts
(
   partnum     INTEGER PRIMARY KEY
, partname    VARCHAR2 (100) UNIQUE
, partstart   DATE
)
/

BEGIN
   INSERT INTO plch_parts
        VALUES (1, 'Mouse', DATE '2009-12-10');

   INSERT INTO plch_parts
        VALUES (100, 'Keyboard', DATE '2009-06-05');

   INSERT INTO plch_parts
        VALUES (500, 'Monitor', DATE '2010-11-01');

   COMMIT;
END;
/


哪些选项需要安装Oracle 11G才能成功运行而不出错?

(A)
SELECT plch_function (partnum, partstart)
    FROM plch_parts
ORDER BY partstart

(B)
SELECT plch_function (n => partnum, d => partstart)
    FROM plch_parts
ORDER BY partstart

(C)
SELECT plch_function (partnum, d => partstart)
    FROM plch_parts
ORDER BY partstart

(D)
CREATE INDEX i_plch_parts
   ON plch_parts (plch_function (partnum, partstart))

(E)
CREATE INDEX i_plch_parts
   ON plch_parts (plch_function (n => partnum, d => partstart))

使用道具 举报

回复
论坛徽章:
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
249#
 楼主| 发表于 2011-12-29 02:25 | 只看该作者

2011-12-27 子程序重载
作者:Steven Feuerstein     
难度:中


下列哪些包的定义能够成功编译不出错?
(A)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   PROCEDURE proc (param IN VARCHAR2);

   PROCEDURE proc (param OUT VARCHAR2);
END;

(B)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   FUNCTION func (param IN VARCHAR2) RETURN DATE;

   FUNCTION func (param IN VARCHAR2) RETURN NUMBER;
END;

(C)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   PROCEDURE proc (param IN VARCHAR2);

   PROCEDURE proc (param IN VARCHAR2);
END;

(D)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   SUBTYPE v1 IS VARCHAR2(100);
   
   PROCEDURE proc (param IN v1);

   PROCEDURE proc (param IN v1);
END;

(E)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   SUBTYPE v1 IS VARCHAR2(100);
   SUBTYPE v2 IS VARCHAR2(100);
   
   PROCEDURE proc (param IN v1);

   PROCEDURE proc (param IN v2);
END;

使用道具 举报

回复
论坛徽章:
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
250#
 楼主| 发表于 2011-12-30 04:15 | 只看该作者
本帖最后由 newkid 于 2011-12-30 04:16 编辑

2011-12-26 答案BCE.
注意题目要求是“哪些选项需要安装Oracle 11G才能成功运行而不出错”, 如果是10G, 则AD选项不出错,而BCE在10G会出错。

2011-12-27 答案ABE.

A: 过程名、参数名全部相同,只是一个是IN 一个是OUT, 能够成功编译不出错,但是如果你试图调用会出错:
PLS-00307: too many declarations of 'PROC' match this call

B: 函数名、参数名全部相同,只是返回值不同,能够成功编译不出错,但是如果你试图调用会出错:
PLS-00307: too many declarations of 'PROC' match this call

C: 编译的时候报错:
PLS-00305 (21: 4): PLS-00305: previous use of 'PROC' (at line 3) conflicts with this use

D: 编译的时候报错:
PLS-00305 (21: 4): PLS-00305: previous use of 'PROC' (at line 3) conflicts with this use

E: A: 过程名、参数名全部相同,参数类型为不同子类型, 能够成功编译不出错,但是如果你试图调用会出错:
PLS-00307: too many declarations of 'PROC' match this call
因为两个子类型其实是相同的。

说实话我认为ABE在编译的时候不报错,是编译器的缺陷。
---------------------------------------------------
2011-12-28 用记录类型修改整行数据(SET ROW)
作者:Steven Feuerstein     
难度:中

我创建了这张表并填充数据:
CREATE TABLE plch_employees
(
   employee_id   INTEGER
, last_name     VARCHAR2 (100)
, first_name    VARCHAR2 (100)
)
/

BEGIN
   INSERT INTO plch_employees
        VALUES (100, 'Bieber', 'Justin');

   INSERT INTO plch_employees
        VALUES (138, 'Croce', 'Jim');

   COMMIT;
END;
/

然后我又创建了一个函数来返回员工表的指定行的数据,姓和名都转换为大写:

CREATE OR REPLACE FUNCTION plch_uc_employee (
   id_in IN INTEGER)
   RETURN plch_employees%ROWTYPE
IS
   l_employee   plch_employees%ROWTYPE;
BEGIN
   SELECT *
     INTO l_employee
     FROM plch_employees
    WHERE employee_id = id_in;

   l_employee.first_name := UPPER (l_employee.first_name);
   l_employee.last_name := UPPER (l_employee.last_name);

   RETURN l_employee;
END;
/

最后,有一个程序来显示/检验员工的名字:

CREATE OR REPLACE PROCEDURE plch_verify
IS
BEGIN
   FOR l_employee IN (  SELECT *
                   FROM plch_employees
               ORDER BY employee_id)
   LOOP
      DBMS_OUTPUT.put_line (
            l_employee.first_name
         || ' '
         || l_employee.last_name);
   END LOOP;
END;
/


哪些选项包含了一个代码快,在执行之后会显示如下两行:
Justin Bieber
JIM CROCE

(A)
DECLARE
   l_employee   plch_employees%ROWTYPE;
BEGIN
   SELECT *
     INTO l_employee
     FROM plch_employees
    WHERE employee_id = 138;

   l_employee.first_name := UPPER (l_employee.first_name);
   l_employee.last_name := UPPER (l_employee.last_name);

   UPDATE plch_employees
      SET ROW = l_employee
    WHERE employee_id = 138;

   plch_verify;
END;
/

(B)
BEGIN
   UPDATE plch_employees
      SET ROW = plch_uc_employee (138)
    WHERE employee_id = 138;

   plch_verify;
END;
/

(C)
DECLARE
   l_employee   plch_employees%ROWTYPE;
BEGIN
   l_employee := plch_uc_employee (138);

   UPDATE plch_employees
      SET row = l_employee
    WHERE employee_id = 138;

   plch_verify;
END;
/

(D)
DECLARE
   l_employee   plch_employees%ROWTYPE;
BEGIN
   SELECT *
     INTO l_employee
     FROM plch_employees
    WHERE employee_id = 138;

   l_employee.first_name := UPPER (l_employee.first_name);
   l_employee.last_name := UPPER (l_employee.last_name);

   UPDATE plch_employees
      SET row = l_employee;

   plch_verify;
END;
/

使用道具 举报

回复

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

本版积分规则 发表回复

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