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

 找回密码
 注册
查看: 960|回复: 5

[每日一题] PL/SQL Challenge 每日一题:2018-6-26 包头和包体的编译

[复制链接]
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期: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:53
跳转到指定楼层
1#
发表于 2018-6-29 03:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(原发表于 2011-10-6)

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

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

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

原始出处:
http://www.plsqlchallenge.com/

作者:Steven Feuerstein

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

我以HR用户登录并且执行下列语句:

CREATE OR REPLACE PACKAGE plch_pkg
IS
   g_stuff   VARCHAR2 (10) := 'Stuff';

   PROCEDURE show_stuff;
END;
/

CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   PROCEDURE show_stuff
   IS
   BEGIN
      DBMS_OUTPUT.put_line (g_stuff);
   END;
END;
/

BEGIN
   plch_pkg.show_stuff;
END;
/

CREATE OR REPLACE PACKAGE plch_pkg
IS
   g_new_stuff   VARCHAR2 (10) := 'NewStuff';
END;
/

BEGIN
   DBMS_OUTPUT.put_line (plch_pkg.g_new_stuff);
END;
/

下列的哪个选项正确反映了在执行上述两个匿名块之后, 我屏幕上的显示内容?


(A)
Stuff
NewStuff

(B)
首先,"Stuff" 会被显示在屏幕上。然后我会看到这个错误:
ORA-04063: package body "HR.PLCH_PKG" has errors
ORA-06508: PL/SQL: could not find program unit being called: "HR.PLCH_PKG"

(C)
Stuff


论坛徽章:
293
生肖徽章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:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
2#
发表于 2018-6-29 08:44 | 只看该作者
本帖最后由 solomon_007 于 2018-6-29 08:55 编辑

答案  B

以为A,包体依赖包头,但包头相对独立,第一次正常显示Stuff; 第二次,包头的全局变量改了,包体无效,但包头可以编译通过,所以第二个块应该可以输出新的全局变量的值。但实际检验结果是B

SQL>
SQL> CREATE OR REPLACE PACKAGE plch_pkg
  2  IS
  3     g_new_stuff   VARCHAR2 (10) := 'NewStuff';
  4  END;
  5  /
Package created

SQL>
SQL> BEGIN
  2     DBMS_OUTPUT.put_line (plch_pkg.g_new_stuff);
  3  END;
  4  /
BEGIN
   DBMS_OUTPUT.put_line (plch_pkg.g_new_stuff);
END;
ORA-04063: package body "HR.PLCH_PKG" has errors
ORA-06508: PL/SQL: could not find program unit being called: "HR.PLCH_PKG"
ORA-06512: at line 2

使用道具 举报

回复
论坛徽章:
0
3#
发表于 2018-6-29 09:14 | 只看该作者
答案B
包由两个部分组成:包头(PACKAGE)和包体(PACKAGE BODY),这两个部分分离的。第二次重新定义了包头,但没有重新定义包体(也就是过程show_stuff在包头没有定义,在包体有定义)。但在包体中出现的过程或函数,如果需要对外调用,就必须在包头中说明,包头中的说明应该和包体中的说明一致。

使用道具 举报

回复
认证徽章
论坛徽章:
21
林肯
日期:2013-07-30 18:00:55秀才
日期:2018-05-22 15:17:21秀才
日期:2018-05-22 15:21:20技术图书徽章
日期:2018-05-22 15:21:47秀才
日期:2018-05-22 15:21:47秀才
日期:2018-05-22 16:13:08秀才
日期:2018-05-22 16:13:21技术图书徽章
日期:2018-05-22 16:13:30秀才
日期:2018-05-22 16:13:30技术图书徽章
日期:2018-05-22 15:17:21
4#
发表于 2018-6-29 10:37 | 只看该作者
B
我的感觉是因为g_stuff   在第一次包体里面用到了的缘故,如果你不在包体里面用到这个变量,其实就是A,你用到了。然后你第二次不给定义肯定报错,别管你调不调用包体里面的函数。
单独执行定义包头,不定义包体,并调用包头,是可以的。

使用道具 举报

回复
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期: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:53
5#
 楼主| 发表于 2018-6-30 04:23 | 只看该作者

答案B, 3楼得奖。2楼可以发新帖修正但请不要编辑原帖子。

A: 这种情况仅仅发生在我修改了包头之后,包体和包头都是有效的。但是此处包体是无效的。
C: 确实会显示这个,但不是所有显示内容。

使用道具 举报

回复
论坛徽章:
293
生肖徽章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:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
6#
发表于 2018-6-30 13:33 | 只看该作者
newkid 发表于 2018-6-30 04:23
答案B, 3楼得奖。2楼可以发新帖修正但请不要编辑原帖子。

A: 这种情况仅仅发生在我修改了包头之后,包 ...

  好!

使用道具 举报

回复

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

本版积分规则

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