楼主: 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
211#
 楼主| 发表于 2011-12-7 02:18 | 只看该作者
2011-12-02 答案BC
DE都是语法错误,%TYPE不可以再重新定义宽度。
A是正确的SUBTYPE用法,且定义了足够宽度所以不会抛出异常。

=================================
2011-12-05 动态SQL
作者:Steven Feuerstein
难度:中

我先创建了这个过程:
CREATE OR REPLACE PROCEDURE plch_show_status (NAME_IN IN VARCHAR2)
IS
   l_status   user_objects.status%TYPE;
BEGIN
   SELECT status
     INTO l_status
     FROM user_objects
    WHERE object_name = NAME_IN;

   DBMS_OUTPUT.put_line (l_status);
END;
/

哪些代码块执行之后会显示"VALID"?

(A)
BEGIN
   EXECUTE IMMEDIATE 'create table plch_data (n number)';
   plch_show_status ('PLCH_DATA');
END;


(B)
BEGIN
   DBMS_UTILITY.exec_ddl_statement (
      'create table plch_data (n number)');
   plch_show_status ('PLCH_DATA');
END;

(C)
BEGIN
   DBMS_SQL.exec_ddl_statement ('
      create table plch_data (n number)');
   plch_show_status ('PLCH_DATA');
END;

(D)
DECLARE
   l_cursor   PLS_INTEGER := DBMS_SQL.open_cursor;
BEGIN
   DBMS_SQL.parse (l_cursor
                 ,  'create table plch_data (n number)'
                 ,  DBMS_SQL.native);
   plch_show_status ('PLCH_DATA');
END;

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
212#
发表于 2011-12-7 10:29 | 只看该作者
AB

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
213#
发表于 2011-12-7 10:37 | 只看该作者
内牛满面,还以为DBMS_SQL.parse后要加DBMS_SQL.execute才可以。。。

使用道具 举报

回复
论坛徽章:
25
奥运会纪念徽章:射击
日期:2013-01-28 09:12:182014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11马上有对象
日期:2014-03-20 16:14:11马上加薪
日期:2014-03-20 16:14:11喜羊羊
日期:2015-04-09 18:46:34秀才
日期:2016-03-24 09:20:52
214#
发表于 2011-12-7 15:38 | 只看该作者
D

使用道具 举报

回复
论坛徽章:
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
215#
 楼主| 发表于 2011-12-8 00:56 | 只看该作者
2011-12-5 答案ABD. 注意D里面仅仅用了DBMS_SQL.parse就执行了DDL, 并没有EXECUTE的步骤。我和加菲猫一起泪流满面。
C: DBMS_SQL.exec_ddl_statement是杜撰出来的。

=================================================
2011-12-6 非空约束和VALUE_ERROR异常
作者:Steven Feuerstein
难度:中

下面这些代码块哪些执行之后会导致未处理的VALUE_ERROR异常?
(A)
DECLARE
   l_string   VARCHAR2 (10);

   TYPE nt IS TABLE OF VARCHAR2 (10) NOT NULL;

   l_nt   nt := nt (l_string);
BEGIN
   l_nt (1) := NULL;
END;


(B)
DECLARE
   TYPE nt IS TABLE OF VARCHAR2 (10) NOT NULL;

   l_nt   nt := nt (NULL);
BEGIN
   l_nt (1) := NULL;
END;

(C)
DECLARE
   TYPE aa IS TABLE OF VARCHAR2 (10) NOT NULL
                 INDEX BY PLS_INTEGER;
   l_aa   aa;
BEGIN
   l_aa (1) := NULL;
END;

(D)
DECLARE
   l_string   VARCHAR2 (10);

   TYPE aa IS TABLE OF VARCHAR2 (10) NOT NULL
                 INDEX BY PLS_INTEGER;
   l_aa       aa;
BEGIN
   l_aa (1) := l_string;
END;


(E)
DECLARE
   l_string   VARCHAR2 (10);

   TYPE nt IS TABLE OF VARCHAR2 (10) NOT NULL;

   l_nt       nt := nt ();
BEGIN
   l_nt.EXTEND;
   l_nt (1) := l_string;
END;

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
216#
发表于 2011-12-8 10:06 | 只看该作者
newkid 发表于 2011-12-8 00:56
2011-12-5 答案ABD. 注意D里面仅仅用了DBMS_SQL.parse就执行了DDL, 并没有EXECUTE的步骤。我和加菲猫一起泪 ...

呵呵,大师也内牛满面,不常见。。。

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
217#
发表于 2011-12-8 10:12 | 只看该作者
IS TABLE OF VARCHAR2 (10) NOT NULL。。。

这种类型的非空约束,一辈子没见过,又猜了

ADE

使用道具 举报

回复
论坛徽章:
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
218#
 楼主| 发表于 2011-12-9 00:58 | 只看该作者
2011-12-6 答案:DE
A:抛出PLS-00382: expression is of wrong type
B:抛出PLS-00567: cannot pass NULL to a NOT NULL constrained formal parameter
C:同A
只要是编译期间能发现的错误就不是VALUE_ERROR;VALUE_ERROR是执行的时候抛出的。
=================================================
2011-12-6 USER_ARGUMENTS相关

作者:Steven Feuerstein
难度:高

我创建了一个名字叫"PLCH_TAB"的表,它有一个列;还有一个名字为 "PLCH_PKG" 的包。然后我对USER_ARGUMENTS表执行如下查询:

DECLARE
   l_count   PLS_INTEGER;
BEGIN
   SELECT COUNT (*)
     INTO l_count
     FROM user_arguments
    WHERE package_name = 'PLCH_PKG' AND data_level > 0;

   DBMS_OUTPUT.put_line (l_count);

   SELECT COUNT (*)
     INTO l_count
     FROM user_arguments
    WHERE package_name = 'PLCH_PKG' AND position = 0;

   DBMS_OUTPUT.put_line (l_count);

   SELECT COUNT (DISTINCT object_name)
     INTO l_count
     FROM user_arguments
    WHERE package_name = 'PLCH_PKG';

   DBMS_OUTPUT.put_line (l_count);
END;
/

我屏幕上的输出是:
2
2
2

下列关于PLCH_PKG的说法中,哪些是有效的结论?

(A)
至少有一个参数或RETURN子句为复合类型,比如记录(record)或对象(OBJECT)类型。

(B)
有两个参数或者RETURN子句的类型被定义为PLCH_TAB%ROWTYPE。

(C)
包头定义中定义了两个函数。

(D)
至少有一个子程序在包中被重载。


使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
219#
发表于 2011-12-9 10:02 | 只看该作者
A

使用道具 举报

回复
论坛徽章:
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
220#
 楼主| 发表于 2011-12-10 05:41 | 只看该作者
2011-12-7 答案AC.
A: 这是因为第一个SELECT的输出为2. 当data_level>0时,表示该参数(返回值)在类型中的层数,只有复合类型或OBJECT TYPE会超过1
B: 没有道理一定是PLCH_TAB%ROWTYPE。其实PLCH_TAB表在这道题中一点用处都没有。
C: 这是因为第二个SELECT的输出为2. 当position=0, 表示这是一个函数的返回值。
D: 这个无法推断,字段OVERLOAD才是是否指明重载。第三个SELECT只是告诉我们至少有两个子程序。
=================================================
2011-12-8

作者:Steven Feuerstein
难度:高

我创建了如下的表并填入数据:
CREATE TABLE plch_tab (n NUMBER)
/

BEGIN
   INSERT INTO plch_tab VALUES (1);
   INSERT INTO plch_tab VALUES (2);
   INSERT INTO plch_tab VALUES (3);
END;
/

然后我创建了这个过程:
CREATE OR REPLACE PROCEDURE plch_execute (string_in IN VARCHAR2)
IS
   l_cursor     PLS_INTEGER := DBMS_SQL.open_cursor ();
   l_feedback   PLS_INTEGER;
BEGIN
   DBMS_SQL.parse (l_cursor, string_in, DBMS_SQL.native);
   l_feedback := DBMS_SQL.execute (l_cursor);
   DBMS_OUTPUT.put_line ('Result=' || l_feedback);
END;
/

哪些选项在执行之后会输出"Result=1"?


(A)
BEGIN
   plch_execute ('update plch_tab set n = n * 10 where n = 1');
END;
/

(B)
BEGIN
   plch_execute ('create table plch_tab2 (n number)');
END;
/

(C)
BEGIN
   plch_execute ('select n from plch_tab where n = 2');
END;
/

(D)
BEGIN
   plch_execute ('update plch_tab set n = n * 10');
END;
/

使用道具 举报

回复

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

本版积分规则 发表回复

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