ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 195|回复: 2

[每日一题] PL/SQL Challenge 每日一题:2017-11-28 外部表

[复制链接]
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
跳转到指定楼层
1#
发表于 2017-12-1 05:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(原发表于 2011-9-1)

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
/forum.php?m ... eid&typeid=1808

原始出处:


作者:Steven Feuerstein

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

我的DBA创建了一个名为"PLCH_TEMP"的目录对象,它指向"c:\temp"。这个目录包含了本题目及选项所引用到的所有文件。我所连接的用户已被赋予对这个目录对象的读写权限,我在这个用户下执行这个问题中的所有代码。

我创建了下列的表:

CREATE TABLE plch_departments
(
   department_id         NUMBER (6)
, department_name       VARCHAR2 (40)
, department_location   VARCHAR2 (25)
)
/

然后我在c:\temp目录下创建了一个名为"departments.txt"的文件,它包含这两行:

1,EXT-Human Resources,Chicago
2,EXT-Information Services,New York


哪些选项在执行之后会显示 "2" ?

(A)
CREATE TABLE plch_departments_ext (
   department_id        NUMBER(6),
   department_name      VARCHAR2(40),
   department_location  VARCHAR2(25)
)
ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY plch_temp
ACCESS PARAMETERS
(
  RECORDS DELIMITED BY NEWLINE
  BADFILE 'departments.bad'
  DISCARDFILE 'departments.dis'
  LOGFILE 'departments.log'
  FIELDS TERMINATED BY ","  OPTIONALLY ENCLOSED BY '"'
  (
   department_id        INTEGER EXTERNAL(6),
   department_name      CHAR(40),
   department_location  CHAR(25)
  )
)
LOCATION ('departments.txt')
)
REJECT LIMIT UNLIMITED
/

DECLARE
   l_department   plch_departments_ext%ROWTYPE;
BEGIN
   INSERT INTO plch_departments
      SELECT *
        FROM plch_departments_ext;

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

(B)
DECLARE
   l_file           UTL_FILE.file_type;
   l_eof            BOOLEAN;
   l_line           VARCHAR2 (32767);
   l_first_comma    PLS_INTEGER;
   l_second_comma   PLS_INTEGER;
   l_count          PLS_INTEGER;

   PROCEDURE get_next_line (line_out OUT VARCHAR2, eof_out OUT BOOLEAN)
   IS
   BEGIN
      UTL_FILE.get_line (l_file, line_out);
      eof_out := FALSE;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         line_out := NULL;
         eof_out := TRUE;
   END get_next_line;
BEGIN
   l_file := UTL_FILE.fopen ('PLCH_TEMP', 'departments.txt', 'R');

   LOOP
      get_next_line (l_line, l_eof);
      EXIT WHEN l_eof;

      l_first_comma :=
         INSTR (l_line
              , ','
              , 1
              , 1);
      l_second_comma :=
         INSTR (l_line
              , ','
              , 1
              , 2);

      INSERT
        INTO plch_departments (department_id
                             , department_name
                             , department_location)
      VALUES (
                SUBSTR (l_line, 1, l_first_comma - 1)
              , SUBSTR (l_line
                      , l_first_comma + 1
                      , l_second_comma - l_first_comma - 1)
              , SUBSTR (l_line, l_second_comma + 1));
   END LOOP;

   SELECT COUNT (*) INTO l_count FROM plch_departments;

   DBMS_OUTPUT.put_line (l_count);

   UTL_FILE.fclose (l_file);
   
   ROLLBACK;
END;
/

(C)
CREATE TABLE plch_departments_ext (
   department_id        NUMBER(6),
   department_name      VARCHAR2(40),
   department_location  VARCHAR2(25)
)
ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY plch_temp
LOCATION ('departments.txt')
)
REJECT LIMIT UNLIMITED
/

DECLARE
   l_department   plch_departments_ext%ROWTYPE;
BEGIN
   INSERT INTO plch_departments
      SELECT *
        FROM plch_departments_ext;

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


论坛徽章:
18
秀才
日期:2016-04-29 15:11:10秀才
日期:2017-04-05 13:27:59秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:22:59秀才
日期:2017-03-02 10:35:32秀才
日期:2017-01-20 11:06:21秀才
日期:2017-01-20 11:00:36秀才
日期:2017-01-20 11:04:31
2#
发表于 2017-12-1 10:21 | 只看该作者
我选ABC
AC、使用外部表完成,其中C使用默认值与文本文件一致。
B、使用UTL_FILE读取文件虽然能实现,但实现过程比较复杂不推荐。

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
3#
 楼主| 发表于 2017-12-2 05:22 | 只看该作者
答案ABC, 2楼得奖。

A:
这个选项利用了外部表的功能。它指定了外部表的许多特征,包括坏数据应该写入哪个文件,文本的结构以及数据文件所在的位置。

B: 呃。是的,它也完成了任务并且显示 "2", 但有许多的代码需要书写/调试/维护。
通常来讲,用UTL_FILE读取文件比用外部表要慢。

C: 这个外部表的用法也能性,虽然它指定了外部表的极少特征。幸运的是,没有提到的东西都是可选项,所以这会导致两行数据被插入plch_departments表。

使用道具 举报

回复

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

本版积分规则

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