楼主: newkid

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

[复制链接]
论坛徽章:
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-15 13:49 | 显示全部楼层
我只好先去 了解下 DML ERROR LOG 再来做题。。。

使用道具 举报

回复
论坛徽章:
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-15 13:55 | 显示全部楼层
估计是A,第1条UPDATE 不了,因为 500*200   number(4)放不下

使用道具 举报

回复
论坛徽章:
39
嫦娥
日期:2015-08-26 10:44:22托尼托尼·乔巴
日期:2019-12-17 00:46:1120周年集字徽章-20	
日期:2020-10-28 14:59:27
发表于 2011-10-15 15:10 | 显示全部楼层
SQL> BEGIN
  2     DBMS_ERRLOG.create_error_log (dml_table_name => 'PLCH_EMPLOYEES');
  3  END;
  4  /
BEGIN
*
ERROR at line 1:
ORA-20069: Unsupported column type(s) found: CLOB_VALUE
ORA-06512: 在 "SYS.DBMS_ERRLOG", line 235
ORA-06512: 在 line 2


CREATE_ERROR_LOG Procedure
This procedure creates the error logging table needed to use the DML error logging capability.
LONG, CLOB, BLOB, BFILE, and ADT datatypes are not supported in the columns.

使用道具 举报

回复
论坛徽章:
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-15 15:11 | 显示全部楼层

2011-10-13

表定义中CLOB 要改为 varchar2 ,不然  DBMS_ERRLOG.create_error_log (dml_table_name => 'PLCH_EMPLOYEES'); 会失败,不支持CLOB类型

验证:
SQL> set serveroutput on size 1000000;
SQL>
SQL> CREATE TABLE plch_employees
  2      (
  3         employee_id   INTEGER
  4      , last_name     VARCHAR2 (100)
  5      , salary        NUMBER (4)
  6      , comments      varchar2(100)
  7      )
  8  /

Table created

SQL>
SQL> BEGIN
  2     INSERT INTO plch_employees
  3          VALUES (100, 'Zuckerberg', 500, 'Went to Harvard');
  4  
  5     INSERT INTO plch_employees
  6          VALUES (200, 'Ellison', 10, 'Did not go to Harvard');
  7  
  8     INSERT INTO plch_employees
  9          VALUES (300, 'Gates', 45, 'Dropped out of Harvard');
10  
11     COMMIT;
12  END;
13  /

PL/SQL procedure successfully completed

SQL>
SQL> BEGIN
  2    DBMS_ERRLOG.create_error_log (dml_table_name => 'PLCH_EMPLOYEES');
  3  END;
  4  /

PL/SQL procedure successfully completed

SQL> desc ERR$_PLCH_EMPLOYEES;
Name            Type           Nullable Default Comments
--------------- -------------- -------- ------- --------
ORA_ERR_NUMBER$ NUMBER         Y                        
ORA_ERR_MESG$   VARCHAR2(2000) Y                        
ORA_ERR_ROWID$  UROWID(4000)   Y                        
ORA_ERR_OPTYP$  VARCHAR2(2)    Y                        
ORA_ERR_TAG$    VARCHAR2(2000) Y                        
EMPLOYEE_ID     VARCHAR2(4000) Y                        
LAST_NAME       VARCHAR2(4000) Y                        
SALARY          VARCHAR2(4000) Y                        
COMMENTS        VARCHAR2(4000) Y                        

SQL>
SQL> BEGIN
  2         UPDATE plch_employees
  3            SET salary = salary * 200
  4     LOG ERRORS REJECT LIMIT UNLIMITED;
  5  
  6     DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
  7  END;
  8  /

2

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL> select * from err$_plch_employees t;

ORA_ERR_NUMBER$ ORA_ERR_MESG$                                                                    ORA_ERR_ROWID$                                                                   ORA_ERR_OPTYP$ ORA_ERR_TAG$                                                                     EMPLOYEE_ID                                                                      LAST_NAME                                                                        SALARY                                                                           COMMENTS
--------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
           1438 ORA-01438: value larger than specified precision allowed for this column         AAAStgAAEAAAAubAAA                                                               U                                                                                               100                                                                              Zuckerberg                                                                       100000                                                                           Went to Harvard

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE        11.2.0.1.0        Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

使用道具 举报

回复
论坛徽章:
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-16 03:16 | 显示全部楼层
2011-10-13 答案是B.

当你决定使用DML的LOG ERRORS特性时,你必须先创建一个错误日志表。这个表可能包含DML表的所有列----但是仅限于那些支持的数据类型。CLOB不是一种被支持的类型。

因此DBMS_ERRLOG.CREATE_ERROR_LOG 将会失败:"ORA-20069: Unsupported column type(s) found:" 意味着错误日志表未能被创建。

如果我试图在plch_employees表使用带LOG ERRORS的DML语句,ORACLE会试图去写入ERR$_PLCH_EMPLOYEES,但是无法找到这张表因此抛出异常:ORA-00942: table or view does not exist

如果我告诉ORACLE跳过不支持的列,那么一切正常:
BEGIN
   DBMS_ERRLOG.create_error_log (
       dml_table_name => 'PLCH_EMPLOYEES'
     , skip_unsupported=>true);
END;
/

假设错误日志表能被正确创建,A将是正确答案。

使用道具 举报

回复
论坛徽章:
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-16 03:33 | 显示全部楼层
2011-10-14
作者:Steven Feuerstein
难度:中

星期一我写了这个存储过程:

CREATE OR REPLACE PROCEDURE plch_show_amounts (
   amount1_in   IN NUMBER
,  amount2_in   IN NUMBER)
IS
BEGIN
   DBMS_OUTPUT.put_line (
      TO_CHAR (plch_show_amounts.amount1_in, 'FML999G999D99'));
   DBMS_OUTPUT.put_line (
      TO_CHAR (plch_show_amounts.amount2_in, 'FML999G999D99'));
END;
/

星期二,我有个同事觉得自己比任何人都知道该如何写好代码,他批评过程中出现的重复代码。“你为什么不把重复的代码放到一个嵌套的子过程?那样的话,假如你需要修改显示格式,或者其他和显示金额相关的东西,你只需修改一个地方。”

好吧,我也没法反对。所以我把代码移入一个嵌套的子过程。实际上,我在推出一个能使用的程序版本之前也这么干过几次。

下面的选项中哪些包含了一个对原始的plch_show_amounts的“重构”,从而在我执行这段代码之后:
BEGIN
   plch_show_amounts (100.45, 452666.77);
END;
/

我在屏幕上会看到这样的输出:

$100.45
$452,666.77


(A)
CREATE OR REPLACE PROCEDURE plch_show_amounts (
   amount1_in   IN NUMBER
,  amount2_in   IN NUMBER)
IS
   PROCEDURE show_one (amount_in IN NUMBER)
   AS
   BEGIN
      DBMS_OUTPUT.put_line (
         TO_CHAR (amount1_in, 'FML999G999D99'));
   END;
BEGIN
   show_one (plch_show_amounts.amount1_in);
   show_one (plch_show_amounts.amount2_in);
END;
/


(B)
CREATE OR REPLACE PROCEDURE plch_show_amounts (
   amount1_in   IN NUMBER
,  amount2_in   IN NUMBER)
IS
   PROCEDURE show_one (amount_in IN NUMBER)
   AS
   BEGIN
      DBMS_OUTPUT.put_line (
         TO_CHAR (amount_in, 'FML999G999D99'));
   END;
BEGIN
   show_one (plch_show_amounts.amount1_in);
   show_one (plch_show_amounts.amount2_in);
END;
/

(C)
CREATE OR REPLACE PROCEDURE plch_show_amounts (
   amount1_in   IN NUMBER
,  amount2_in   IN NUMBER)
IS
   PROCEDURE show_one (amount1_in IN NUMBER)
   AS
   BEGIN
      DBMS_OUTPUT.put_line (
         TO_CHAR (amount1_in, 'FML999G999D99'));
   END;
BEGIN
   show_one (plch_show_amounts.amount1_in);
   show_one (plch_show_amounts.amount2_in);
END;
/

(D)
CREATE OR REPLACE PROCEDURE plch_show_amounts (
   amount1_in   IN NUMBER
,  amount2_in   IN NUMBER)
IS
   PROCEDURE show_one (amount1_in IN NUMBER)
   AS
   BEGIN
      DBMS_OUTPUT.put_line (
         TO_CHAR (plch_show_amounts.amount1_in, 'FML999G999D99'));
   END;
BEGIN
   show_one (plch_show_amounts.amount1_in);
   show_one (plch_show_amounts.amount2_in);
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
发表于 2011-10-17 10:06 | 显示全部楼层
2011-10-14  

BC (未验证)

使用道具 举报

回复
论坛徽章:
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-17 10:39 | 显示全部楼层
B肯定没问题 C。。。。做实验去

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2011-10-17 12:51 | 显示全部楼层
47,就近原理,这个很多程序都有这个规则

使用道具 举报

回复
论坛徽章:
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-17 13:51 | 显示全部楼层

--验证:


SQL> set serveroutput on size 1000000;
SQL> --(A)
SQL>
SQL> CREATE OR REPLACE PROCEDURE plch_show_amounts (
  2     amount1_in   IN NUMBER
  3  ,  amount2_in   IN NUMBER)
  4  IS
  5     PROCEDURE show_one (amount_in IN NUMBER)
  6     AS
  7     BEGIN
  8        DBMS_OUTPUT.put_line (
  9           TO_CHAR (amount1_in, 'FML999G999D99'));
10     END;
11  BEGIN
12     show_one (plch_show_amounts.amount1_in);
13     show_one (plch_show_amounts.amount2_in);
14  END;
15  /

Procedure created

SQL> exec plch_show_amounts (100.45, 452666.77);

RMB100.45
RMB100.45

PL/SQL procedure successfully completed

SQL>
SQL> --(B)
SQL> CREATE OR REPLACE PROCEDURE plch_show_amounts (
  2     amount1_in   IN NUMBER
  3  ,  amount2_in   IN NUMBER)
  4  IS
  5     PROCEDURE show_one (amount_in IN NUMBER)
  6     AS
  7     BEGIN
  8        DBMS_OUTPUT.put_line (
  9           TO_CHAR (amount_in, 'FML999G999D99'));
10     END;
11  BEGIN
12     show_one (plch_show_amounts.amount1_in);
13     show_one (plch_show_amounts.amount2_in);
14  END;
15  /

Procedure created

SQL> exec plch_show_amounts (100.45, 452666.77);

RMB100.45
RMB452,666.77

PL/SQL procedure successfully completed

SQL>
SQL> --(C)
SQL> CREATE OR REPLACE PROCEDURE plch_show_amounts (
  2     amount1_in   IN NUMBER
  3  ,  amount2_in   IN NUMBER)
  4  IS
  5     PROCEDURE show_one (amount1_in IN NUMBER)
  6     AS
  7     BEGIN
  8        DBMS_OUTPUT.put_line (
  9           TO_CHAR (amount1_in, 'FML999G999D99'));
10     END;
11  BEGIN
12     show_one (plch_show_amounts.amount1_in);
13     show_one (plch_show_amounts.amount2_in);
14  END;
15  /

Procedure created

SQL> exec plch_show_amounts (100.45, 452666.77);

RMB100.45
RMB452,666.77

PL/SQL procedure successfully completed

SQL>
SQL> --(D)
SQL> CREATE OR REPLACE PROCEDURE plch_show_amounts (
  2     amount1_in   IN NUMBER
  3  ,  amount2_in   IN NUMBER)
  4  IS
  5     PROCEDURE show_one (amount1_in IN NUMBER)
  6     AS
  7     BEGIN
  8        DBMS_OUTPUT.put_line (
  9           TO_CHAR (plch_show_amounts.amount1_in, 'FML999G999D99'));
10     END;
11  BEGIN
12     show_one (plch_show_amounts.amount1_in);
13     show_one (plch_show_amounts.amount2_in);
14  END;
15  /

Procedure created

SQL> exec plch_show_amounts (100.45, 452666.77);

RMB100.45
RMB100.45

PL/SQL procedure successfully completed

使用道具 举报

回复

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

本版积分规则 发表回复

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