楼主: newkid

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

[复制链接]
论坛徽章:
3
迷宫蛋
日期:2012-05-28 11:08:36灰彻蛋
日期:2012-06-15 10:19:34林肯
日期:2013-07-30 18:00:55
161#
发表于 2011-11-20 16:41 | 只看该作者
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
162#
 楼主| 发表于 2011-11-22 01:12 | 只看该作者
本帖最后由 newkid 于 2011-11-23 00:01 编辑

2011-11-17答案C.
一个定义为调用者权限(AUTHID CURRENT_USER)的函数,如果它在一个VIEW或者触发器中被调用,这时是按照定义者的权限来运作的,所以你通过VIEW看到的将是OWNER的数据,而不是当前用户的数据。
=====================================

2011-11-18 触发器中的:NEW 和 :OLD
作者:Steven Feuerstein
难度:低

我创建了这两张表,并在plch_parts表中加了两行数据:

CREATE TABLE plch_parts
(
   partnum    NUMBER
,  partname   VARCHAR2 (50)
)
/

BEGIN
   INSERT INTO plch_parts
        VALUES (123, 'Steering Wheel');

   INSERT INTO plch_parts
        VALUES (456, 'Brake Pedal');

   COMMIT;
END;
/

CREATE TABLE plch_log
(
   partnum      NUMBER
,  partname     VARCHAR2 (50)
,  changed_on   DATE
,  changed_by   VARCHAR2 (100)
)
/

然后我在 plch_parts 表上加了个触发器:
CREATE OR REPLACE TRIGGER plch_parts_trig
   AFTER UPDATE
   ON plch_parts
   FOR EACH ROW
DECLARE
BEGIN
   INSERT INTO plch_log
        VALUES (:new.partnum
              ,  :new.partname
              ,  SYSDATE
              ,  USER);
END plch_parts_trig;
/

然后我执行了这个块:
BEGIN
   UPDATE plch_parts
      SET partnum = -1 * partnum
    WHERE partname = 'Brake Pedal';

   UPDATE plch_parts
      SET partname = UPPER (partname)
    WHERE partnum = 123;
   COMMIT;
END;
/

下列选项哪些显示了这个查询的结果:
SELECT partnum, partname
    FROM plch_log
ORDER BY partnum
/

(A)
   PARTNUM PARTNAME                                          
---------- ------------------
      -456 Brake Pedal                                       
       123 STEERING WHEEL  
(B)
   PARTNUM PARTNAME                                          
---------- ------------------
       123 Steering Wheel
       456 Brake Pedal            
                     
(C)
   PARTNUM PARTNAME                                          
---------- ------------------
       123 STEERING WHEEL  
       456 Brake Pedal     

(D)
   PARTNUM PARTNAME                                          
---------- ------------------
       123 STEERING WHEEL  
      -456 Brake Pedal        

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
163#
发表于 2011-11-22 08:45 | 只看该作者
A

使用道具 举报

回复
论坛徽章:
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
164#
发表于 2011-11-22 10:45 | 只看该作者
A

使用道具 举报

回复
论坛徽章:
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
165#
发表于 2011-11-22 11:21 | 只看该作者
newkid 发表于 2011-11-22 01:12
2011-11-17答案B.
一个定义为调用者权限(AUTHID CURRENT_USER)的函数,如果它在一个VIEW或者触发器中被调 ...

2011-11-17 我今天验证得到结果是 C


SQL> set serveroutput on;
SQL>
SQL> CREATE TABLE plch_parts
  2  (
  3     partnum    NUMBER
  4  , partname   VARCHAR2 (50)
  5  )
  6  /

Table created

SQL>
SQL> BEGIN
  2     INSERT INTO plch_parts
  3          VALUES (123, 'Steering Wheel');
  4  
  5     INSERT INTO plch_parts
  6          VALUES (456, 'Brake Pedal');
  7  
  8     COMMIT;
  9  END;
10  /

PL/SQL procedure successfully completed

SQL> CREATE OR REPLACE TYPE plch_numbers_t IS TABLE OF NUMBER
  2  /

Type created

SQL>
SQL> CREATE OR REPLACE FUNCTION plch_func
  2     RETURN plch_numbers_t
  3     AUTHID CURRENT_USER
  4  IS
  5     l_numbers   plch_numbers_t;
  6  BEGIN
  7     SELECT partnum
  8       BULK COLLECT INTO l_numbers
  9       FROM plch_parts;
10  
11     RETURN l_numbers;
12  END;
13  /

Function created

SQL>
SQL> CREATE OR REPLACE VIEW plch_func_v
  2  AS
  3     SELECT COLUMN_VALUE partnum FROM TABLE (plch_func ())
  4  /

View created

SQL> GRANT SELECT ON plch_func_v TO scott
  2  /

Grant succeeded

SQL> GRANT EXECUTE ON plch_func TO scott
  2  /

Grant succeeded

SQL> conn scott/tiger;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as scott

SQL>
SQL> CREATE TABLE plch_parts
  2  (
  3     partnum    NUMBER
  4  , partname   VARCHAR2 (50)
  5  )
  6  /

Table created

SQL>
SQL> BEGIN
  2     INSERT INTO plch_parts
  3          VALUES (100, 'Tire');
  4  
  5     INSERT INTO plch_parts
  6          VALUES (101, 'Battery');
  7  
  8     COMMIT;
  9  END;
10  /

PL/SQL procedure successfully completed


SQL> set serveroutput on size 1000000;
SQL>
SQL> BEGIN
  2     DBMS_OUTPUT.put_line ('Two Cursor For Loops....');
  3  
  4     FOR rec IN (  SELECT p.partname
  5                     FROM TABLE (hr.plch_func) v, plch_parts p
  6                    WHERE v.column_value = p.partnum
  7                 ORDER BY p.partnum)
  8     LOOP
  9        DBMS_OUTPUT.put_line (rec.partname);
10     END LOOP;
11  
12     FOR rec IN (  SELECT p.partname
13                     FROM hr.plch_func_v v, plch_parts p
14                    WHERE v.partnum = p.partnum
15                 ORDER BY p.partnum)
16     LOOP
17        DBMS_OUTPUT.put_line (rec.partname);
18     END LOOP;
19  END;
20  /

Two Cursor For Loops....
Tire
Battery

PL/SQL procedure successfully completed

使用道具 举报

回复
论坛徽章:
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
166#
 楼主| 发表于 2011-11-23 00:06 | 只看该作者
solomon_007 发表于 2011-11-22 11:21
2011-11-17 我今天验证得到结果是 C

确实是C, 我笔误写成了B, 已经改过来了。
2011-11-18答案A, 这个很简单。
=========================
2011-11-21 未捕获异常
作者:Steven Feuerstein
难度:中

下列哪些选项在执行之后会导致未捕获的异常:
ORA-06502: PL/SQL: numeric or value error: number precision too large

(A)
DECLARE
   l_number   NUMBER (2) := 100;
BEGIN
   DBMS_OUTPUT.put_line (l_number);
END;
/

(B)
DECLARE
   l_number   NUMBER (2) := 100;
BEGIN
   DBMS_OUTPUT.put_line (l_number);
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('ERROR');
END;
/
                     
(C)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   FUNCTION get_number
      RETURN NUMBER;
END;
/

CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   g_date     DATE;
   g_number   NUMBER (2) := 100;

   FUNCTION get_number
      RETURN NUMBER
   IS
   BEGIN
      RETURN g_number;
   END;
BEGIN
   g_date := SYSDATE;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('ERROR');
END;
/

DECLARE
   l_number   NUMBER (2) := plch_pkg.get_number;
BEGIN
   DBMS_OUTPUT.put_line (l_number);
END;
/

(D)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   g_number   NUMBER (2) := 100;
END;
/

DECLARE
   l_number   NUMBER (2) := plch_pkg.g_number;
BEGIN
   DBMS_OUTPUT.put_line (l_number);
END;
/
      

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
167#
发表于 2011-11-23 00:41 | 只看该作者
喜欢这类型的东东,不用耗费太多心思在复杂的计算上,但却需要扎实的基础知识与实践功底

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
168#
发表于 2011-11-23 08:50 | 只看该作者
AD

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
169#
发表于 2011-11-23 08:53 | 只看该作者
肉流满面

使用道具 举报

回复
论坛徽章:
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
170#
发表于 2011-11-23 09:21 | 只看该作者
ABCD

使用道具 举报

回复

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

本版积分规则 发表回复

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