楼主: newkid

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

[复制链接]
论坛徽章:
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
221#
发表于 2011-12-10 15:00 | 只看该作者
B  

"DBMS_SQL.execute" ddl 不需要,前两天才了解的

使用道具 举报

回复
论坛徽章:
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
222#
 楼主| 发表于 2011-12-13 00:05 | 只看该作者
2011-12-08答案A. DBMS_SQL.execute的返回值是执行行数,仅对DML(DELETE,INSERT,UPDATE)有效。
B:是DDL不是DML
C:是SELECT不是DML
D:总共UPDATE了三行不是一行。
========================================
2011-12-09 Inner capture
作者:Steven Feuerstein
难度:中

我创建了这张表并填入数据:
CREATE TABLE plch_employees
(
   employee_id   INTEGER
, salary        NUMBER
)
/

BEGIN
   INSERT INTO plch_employees VALUES (1, 500);
   INSERT INTO plch_employees VALUES (2, 750);
   COMMIT;
END;
/

哪些选项实现了一个名字为plch_change_salary的存储过程,从而使得下列代码执行之后会显示"1000"?

DECLARE
   l_salary   plch_employees.salary%TYPE;
BEGIN
   plch_change_salary (1, 1000);

   SELECT salary INTO l_salary
     FROM plch_employees
    WHERE employee_id = 1;

   DBMS_OUTPUT.put_line (l_salary);
END;
/

(A)
CREATE OR REPLACE PROCEDURE plch_change_salary (
   employee_id   IN plch_employees.employee_id%TYPE
, salary        IN plch_employees.salary%TYPE)
IS
BEGIN
   UPDATE plch_employees
      SET salary = salary
    WHERE employee_id = employee_id;
END;
/

(B)
CREATE OR REPLACE PROCEDURE plch_change_salary (
   employee_id   IN plch_employees.employee_id%TYPE
, salary        IN plch_employees.salary%TYPE)
IS
BEGIN
   UPDATE plch_employees e
      SET e.salary = salary
    WHERE e.employee_id = employee_id;
END;
/

(C)
CREATE OR REPLACE PROCEDURE plch_change_salary (
   employee_id_in   IN plch_employees.employee_id%TYPE
, salary_in        IN plch_employees.salary%TYPE)
IS
BEGIN
   UPDATE plch_employees
      SET salary = salary_in
    WHERE employee_id = employee_id_in;
END;
/

(D)
CREATE OR REPLACE PROCEDURE plch_change_salary (
   employee_id   IN plch_employees.employee_id%TYPE
, salary        IN plch_employees.salary%TYPE)
IS
BEGIN
   UPDATE plch_employees
      SET salary = plch_change_salary.salary
    WHERE employee_id = plch_change_salary.employee_id;
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
223#
发表于 2011-12-13 08:45 | 只看该作者
ABC

使用道具 举报

回复
论坛徽章:
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
224#
发表于 2011-12-13 08:49 | 只看该作者
唉~

使用道具 举报

回复
论坛徽章:
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
225#
发表于 2011-12-13 08:59 | 只看该作者
唉~

使用道具 举报

回复
论坛徽章:
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
226#
 楼主| 发表于 2011-12-14 00:42 | 只看该作者
2011-12-09 答案CD.
A: 参数名和列名重复,在SQL里面被优先解释为列名,所以 WHERE employee_id = employee_id 实际上是 WHERE employee_id IS NOT NULL
B: 类似于A, WHERE e.employee_id = employee_id 右边的employee_id还是会被解释为列名。
C: 通过取不同的名字避免了命名冲突。
D: 通过在变量名前面加上过程名的办法显式引用。
========================
2011-12-12 11G新功能:CONTINUE语句
作者:Steven Feuerstein
难度:中

下列关于CONTINUE语句的陈述哪些是正确的?

(A)
在FORALL语句的头部加入CONTINUE, 这样可以允许ORACLE忽略FORALL里面执行的任意一个DML引发的异常。
(B)
CONTINUE语句不能够用在数值型的FOR循环。
(C)
你可以在CONTINUE语句后面指明一个标签(LABEL), 但这是可选的。这个标签必须对应当前或外层循环。
(D)
你可以在一个PLSQL的任何地方使用CONTINUE语句。如果不在循环中,PL/SQL运行引擎会继续执行这个块。

使用道具 举报

回复
论坛徽章:
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
227#
 楼主| 发表于 2011-12-15 00:22 | 只看该作者
2011-12-12 答案C.
A: FORALL里面不能用CONTINUE, 要忽略异常必须用SAVE EXCEPTIONS
B: 没有此限制。
D: 不能够用在循环外,否则报错:
PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
PLS-00373: EXIT/CONTINUE label 'label_name' must label a LOOP statement
========================
2011-12-13 逻辑运算优先级
作者:Steven Feuerstein
难度:低


我定义了这个帮助过程来显示一个布尔类型的值:
CREATE OR REPLACE PROCEDURE plch_show_boolean (
   val IN BOOLEAN)
IS
BEGIN
   DBMS_OUTPUT.put_line (
      CASE val
         WHEN TRUE THEN 'TRUE'
         WHEN FALSE THEN 'FALSE'
         ELSE 'NULL'
      END);
END plch_show_boolean;
/

下列哪些代码块执行之后会显示如下文本?
TRUE
FALSE
TRUE
FALSE

(A)
DECLARE
   this   BOOLEAN := FALSE;
   that   BOOLEAN := FALSE;
BEGIN
   plch_show_boolean (NOT this);
   plch_show_boolean (that);
   plch_show_boolean (NOT that);
   plch_show_boolean (this);
END;
/

(B)
DECLARE
   this   BOOLEAN := FALSE;
   that   BOOLEAN := FALSE;
BEGIN
   plch_show_boolean (NOT that AND NOT this);
   plch_show_boolean (NOT this AND that);
   plch_show_boolean (NOT (this AND that));
   plch_show_boolean (this AND NOT that);
END;
/

(C)
DECLARE
   this   BOOLEAN := FALSE;
   that   BOOLEAN := FALSE;
BEGIN
   plch_show_boolean (this OR that);
   plch_show_boolean (this OR NOT that);
   plch_show_boolean (NOT (this OR that));
   plch_show_boolean (NOT this AND NOT that);
END;
/

(D)
DECLARE
   this   BOOLEAN := FALSE;
   that   BOOLEAN := FALSE;
BEGIN
   plch_show_boolean (
      CASE this WHEN that THEN TRUE ELSE FALSE END);
   plch_show_boolean (this AND that IS NULL);
   plch_show_boolean (this = that);
   plch_show_boolean (this < that);
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
228#
发表于 2011-12-15 08:53 | 只看该作者
本帖最后由 gyhgood 于 2011-12-15 08:55 编辑

A
B漏写了补充一下
剩下做实验去

使用道具 举报

回复
论坛徽章:
0
229#
发表于 2011-12-15 14:14 | 只看该作者
非常有用呀。

使用道具 举报

回复
论坛徽章:
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
230#
 楼主| 发表于 2011-12-16 00:59 | 只看该作者
2011-12-13 答案 ABD.

布尔表达式的关系运算符优先级是 NOT>AND>OR.

比较有趣的是, 如果要比较两个布尔类型的大小,则FALSE比TRUE要小。
可以通过下列代码验证:
BEGIN
   plch_show_boolean (TRUE > FALSE);
   plch_show_boolean (FALSE > TRUE);
END;
/

===============================
2011-12-14 集合去重
作者:Steven Feuerstein
难度:高

我定义了一个集合(COLLECTION)类型和一个帮助过程来显示一个集合的内容:

CREATE OR REPLACE TYPE plch_strings_t
   IS TABLE OF VARCHAR2 (100)
/

CREATE OR REPLACE PROCEDURE plch_show_strings (
   strings_in IN plch_strings_t)
IS
BEGIN
   FOR indx IN 1 .. strings_in.COUNT
   LOOP
      DBMS_OUTPUT.put_line (strings_in (indx));
   END LOOP;
END;
/


哪些选项实现了这个函数:
FUNCTION plch_remove_dups (
   strings_in IN plch_strings_t)
   RETURN plch_strings_t

从而使的我执行了如下代码之后:
DECLARE
   s1   plch_strings_t
           := plch_strings_t ('a'
                            , 'a'
                            , 'b'
                            , 'b'
                            , 'c');
BEGIN
   plch_show_strings (plch_remove_dups (s1));
END;
/

屏幕上会显示"a", "b" 和 "c",每个只显示一次?
假设集合里的每个元素都非空,而且传入plch_remove_dups的嵌套表永远都是从下标1开始的密集填充集合(即数组下标从1开始而且中间没有缺少)。

(A)
IS
BEGIN
   RETURN DISTINCT(strings_in);
END;

(B)
IS
   TYPE strings_aat IS TABLE OF BOOLEAN
                          INDEX BY VARCHAR2 (100);

   l_index     VARCHAR2 (100);
   l_strings   strings_aat;
   l_return    plch_strings_t := plch_strings_t ();
BEGIN
   FOR indx IN 1 .. strings_in.COUNT
   LOOP
      l_strings (strings_in (indx)) := NULL;
   END LOOP;

   l_index := l_strings.FIRST;

   WHILE (l_index IS NOT NULL)
   LOOP
      l_return.EXTEND;
      l_return (l_return.LAST) := l_index;
      l_index := l_strings.NEXT (l_index);
   END LOOP;

   RETURN l_return;
END;

(C)
IS
BEGIN
   RETURN SET (strings_in);
END;

(D)
IS
   l_return    plch_strings_t := plch_strings_t ();
BEGIN
   FOR indx IN 1 .. strings_in.COUNT
   LOOP
      IF NOT l_return.EXISTS (strings_in (indx))
      THEN
         l_return.EXTEND;
         l_return (l_return.LAST) := strings_in (indx);
      END IF;
   END LOOP;

   RETURN l_return;
END;

使用道具 举报

回复

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

本版积分规则 发表回复

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