楼主: newkid

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

[复制链接]
论坛徽章:
14
2012新春纪念徽章
日期:2012-01-04 11:58:182012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59马上加薪
日期:2014-08-09 14:42:472014年世界杯参赛球队: 美国
日期:2014-06-04 09:05:20优秀写手
日期:2014-03-12 06:00:13马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:水球
日期:2012-10-11 16:40:16
发表于 2011-10-13 21:32 | 显示全部楼层
不知7号的题目俱体考啥?

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2011-10-13 22:10 | 显示全部楼层
本帖最后由 newkid 于 2011-10-13 22:12 编辑

2011-10-11 答案是D。出现中文月份是NLS设置的原因。
2011-10-7考的是你对PLSQL命名方式的理解。

2011-10-12
作者:_Nikotin
难度:高

我建立了一个表并生成一行数据::
create table plch_one_row (id number);
insert into plch_one_row values (1);
commit;

然后我建立一个过程来检查我的表里这行数据是否被锁住。我用的方法是在一个带有自治事务的过程里试图对这行进行加锁。
CREATE OR REPLACE PROCEDURE plch_check_lock
AS
   PRAGMA AUTONOMOUS_TRANSACTION;
   resource_busy   EXCEPTION;
   PRAGMA EXCEPTION_INIT (resource_busy, -54);
   l_id            plch_one_row.id%TYPE;
BEGIN
       SELECT id
         INTO l_id
         FROM plch_one_row
   FOR UPDATE NOWAIT;

   DBMS_OUTPUT.put_line ('Not locked');
   COMMIT;
EXCEPTION
   WHEN resource_busy
   THEN
      DBMS_OUTPUT.put_line ('Locked');
END;
/

下列的选项中,哪些可以用来代替下面这个块中的/* code */注释,从而执行之后会显示"Not locked"? 你可以假定在执行之前表上没有锁。

BEGIN
  /* code */
  plch_check_lock;
END;
/

(A)
begin
  for rec in (select 1/0 from plch_one_row for update) loop
    null;
  end loop;
exception
  when zero_divide then
    null;
end;

(B)
declare
  cursor cur is select 1/0 from plch_one_row for update;
begin
  for rec in cur loop
    null;
  end loop;
exception
  when zero_divide then
    null;
end;

(C)
declare
  cursor cur is select 1/0 from plch_one_row for update;
begin
  savepoint before_loop;
  for rec in cur loop
    null;
  end loop;
exception
  when zero_divide then
    rollback to before_loop;
end;

(D)
begin
  savepoint before_loop;
  for rec in (select 1/0 from plch_one_row for update) loop
    null;
  end loop;
exception
  when zero_divide then
    rollback to before_loop;
end;

这道题考的是各种带锁游标加锁的时机。

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2011-10-13 22:11 | 显示全部楼层
本帖最后由 newkid 于 2011-10-14 05:18 编辑

顶楼已经加上索引。

使用道具 举报

回复
论坛徽章:
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
发表于 2011-10-14 09:04 | 显示全部楼层
没测试之前,我猜测 答案是 CD。
select for update ,我觉得是先执行 for update,然后执行 select 的1/0,所以还是锁住了记录,AB排除。
通过rollback可以回滚到锁之前的状态,所以CD可以解锁。

使用道具 举报

回复
论坛徽章:
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
发表于 2011-10-14 09:10 | 显示全部楼层
sohay 发表于 2011-10-14 09:04
没测试之前,我猜测 答案是 CD。
select for update ,我觉得是先执行 for update,然后执行 select 的1/0, ...

经过测试,发现我仍然没理解游标锁的机制

使用道具 举报

回复
论坛徽章:
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
发表于 2011-10-14 09:14 | 显示全部楼层
好难啊,怎么看最后都会直接跑到异常里面去。我还是乖乖动手验证一下去吧

使用道具 举报

回复
论坛徽章:
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
发表于 2011-10-14 09:17 | 显示全部楼层
本帖最后由 gyhgood 于 2011-10-14 09:17 编辑

顶楼索引我改了改,用楼层链接多好啊电梯直达
  1. 33楼 2011-10-12 各种带锁游标加锁的时机                           http://www.itpub.net/forum.php?mod=redirect&goto=findpost&ptid=1499223&pid=18410284
  2. 25楼 2011-10-11 字符串转换格式                                       http://www.itpub.net/forum.php?mod=redirect&goto=findpost&ptid=1499223&pid=18405826
  3. 16楼 2011-10-10 COLLECTION的EXISTS接受NULL参数的表现 http://www.itpub.net/forum.php?mod=redirect&goto=findpost&ptid=1499223&pid=18401400
  4. 15楼 2011-10-07 PLSQL的命名方法                                    http://www.itpub.net/forum.php?mod=redirect&goto=findpost&ptid=1499223&pid=18401389
  5. 14楼 2011-10-06 修改包头后对变量的引用                           http://www.itpub.net/forum.php?mod=redirect&goto=findpost&ptid=1499223&pid=18401380
复制代码

使用道具 举报

回复
论坛徽章:
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
发表于 2011-10-14 09:29 | 显示全部楼层
本帖最后由 gyhgood 于 2011-10-14 10:09 编辑

反复试验找到点感觉了下次估计再有类似的题应该能答上

使用道具 举报

回复
论坛徽章:
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
发表于 2011-10-14 10:33 | 显示全部楼层

答案 ACD (验证之前,我猜对了喔

验证:

SQL> set serveroutput on;
SQL> create table plch_one_row (id number);

Table created

SQL> insert into plch_one_row values (1);

1 row inserted

SQL> commit;

Commit complete

SQL>
SQL> CREATE OR REPLACE PROCEDURE plch_check_lock
  2  AS
  3     PRAGMA AUTONOMOUS_TRANSACTION;
  4     resource_busy   EXCEPTION;
  5     PRAGMA EXCEPTION_INIT (resource_busy, -54);
  6     l_id            plch_one_row.id%TYPE;
  7  BEGIN
  8         SELECT id
  9           INTO l_id
10           FROM plch_one_row
11     FOR UPDATE NOWAIT;
12  
13     DBMS_OUTPUT.put_line ('Not locked');
14     COMMIT;
15  EXCEPTION
16     WHEN resource_busy
17     THEN
18        DBMS_OUTPUT.put_line ('Locked');
19  END;
20  /

Procedure created

SQL>
SQL> --(A)
SQL> BEGIN
  2    begin
  3    for rec in (select 1/0 from plch_one_row for update) loop
  4        null;
  5      end loop;
  6    exception
  7      when zero_divide then
  8        null;
  9    end;
10    plch_check_lock;
11  END;
12  /

Not locked

PL/SQL procedure successfully completed

SQL>
SQL> --(B)
SQL> BEGIN
  2    declare
  3      cursor cur is select 1/0 from plch_one_row for update;
  4    begin
  5      for rec in cur loop
  6        null;
  7      end loop;
  8    exception
  9      when zero_divide then
10        null;
11    end;
12    plch_check_lock;
13  END;
14  /

Locked

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL>
SQL> --(C)
SQL> BEGIN
  2    declare
  3      cursor cur is select 1/0 from plch_one_row for update;
  4    begin
  5      savepoint before_loop;
  6      for rec in cur loop
  7        null;
  8      end loop;
  9    exception
10      when zero_divide then
11        rollback to before_loop;
12    end;
13    plch_check_lock;
14  END;
15  
16  
17  /

Not locked

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL>
SQL> --(D)
SQL> BEGIN
  2    begin
  3      savepoint before_loop;
  4      for rec in (select 1/0 from plch_one_row for update) loop
  5        null;
  6      end loop;
  7    exception
  8      when zero_divide then
  9        rollback to before_loop;
10    end;
11    plch_check_lock;
12  END;
13  /

Not locked

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2011-10-15 00:29 | 显示全部楼层
猫猫厉害。2011-10-12答案:
(A)正确:如果用隐性游标循环,发生异常时锁会被释放
(B)不正确,如果用显性游标循环,发生异常时锁不会被释放
(C)正确:异常被捕获,显式回滚到SAVE POINT, 因而锁被释放。
(D)正确:同A, 异常处理里的回滚相当于什么也没做。


2011-10-13
作者:Steven Feuerstein
难度:高

我执行下列语句:
CREATE TABLE plch_employees
(
   employee_id   INTEGER
, last_name     VARCHAR2 (100)
, salary        NUMBER (4)
, clob_value    CLOB
)
/

BEGIN
   INSERT INTO plch_employees
        VALUES (100, 'Zuckerberg', 500, 'Went to Harvard');

   INSERT INTO plch_employees
        VALUES (200, 'Ellison', 10, 'Did not go to Harvard');

   INSERT INTO plch_employees
        VALUES (300, 'Gates', 45, 'Dropped out of Harvard');

   COMMIT;
END;
/

BEGIN
   DBMS_ERRLOG.create_error_log (dml_table_name => 'PLCH_EMPLOYEES');
END;
/


如果我执行下列语句块给尽可能多的员工大幅度加薪,下列的选项中哪些描述了我将在屏幕上看到的信息?

BEGIN
       UPDATE plch_employees
          SET salary = salary * 200
   LOG ERRORS REJECT LIMIT UNLIMITED;

   DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
END;
/

(A)
2

(B)
下列异常信息未被处理并传播出来:
ORA-00942: table or view does not exist

(C)
0

这道题考的是你对10G的新特性DML ERROR LOG的了解程度

使用道具 举报

回复

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

本版积分规则 发表回复

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