当前位置:  数据库>oracle

Oracle Schema名字和Object名字相同时带来的问题

    来源: 互联网  发布时间:2017-04-26

    本文导语: Table 名字和 Schema名字相同: 有schema和表名都为Arwen.Schema Arwen里面有一个包PKG,包里有函数Plus,返回两数相加的结果SELECT Arwen.PKG.Plus(1,2) FROM dual; --执行这条sql没出啥错,返回结果3.但在一个pl/sql 块中就出错了declareresult int;beginselect ...

Table 名字和 Schema名字相同:

有schema和表名都为Arwen.
Schema Arwen里面有一个包PKG,包里有函数Plus,返回两数相加的结果
SELECT Arwen.PKG.Plus(1,2) FROM dual; --执行这条sql没出啥错,返回结果3.
但在一个pl/sql 块中就出错了
declare
result int;
begin
select Arwen.PKG.Plus(1,2) into result from dual;
dbms_output.put_line(result);
end;








如果把表Arwen Drop掉,则pl/sql块正确执行.(如果有函数或视图其他对象的名字和schema相同也会出错)

关于这问题的解释

觉得有点奇怪就上网搜了下,然后在Oralce官方网站上看到有关pl/sql的名字解析方式的介绍,有这么一段话:
PL/SQL and SQL resolve qualified names differently.
For example, when resolving the table name HR.JOBS:
• PL/SQL searches first for packages, types, tables, and views named HR in the current schema, and then for objects named JOBS in the HR schema.
• SQL searches first for objects named JOBS in the HR schema, and then for packages, types, tables, and views named HR in the current schema.



按这解释貌似就可以理解上面的问题了.在sql的名字解析中,碰到带点号的这样的前缀先是把点号前面的当Schema解析,那么Arwen.PKG.Plus(1,2)这语句是先把Arwen当
Schema,然后PKG解析成Schema下的对象,在这里是包.但在PL/SQL中先把点后前面的当成当前schema下的对象,这样Arwen.PKG.Plus(1,2)中的Arwen先被解析成表Arwen,然后pkg解析成表中字段,由于没这样的字段就出错了

看起来Oracle文档上说的没错了,不过发现再弄个例子一试,还是有问题啊,文档里说HR.JOBS是个表,是表的话不太好举例,我就把JOBS改成个函数吧.示例如下
有Schema HR,HR中
有函数JOBS,(没有虚拟机装Oracle R12与Oracle10g iis7站长之家,返回字符串'jobs of schema').
有包HR,包中有函数JOBS,(没有参数,返回字符串'jobs of pkg').
如果按照文档里说的,SELECT HR.JOBS FROM dual;--应该返回的是jobs of schema.
而在pl/sql块中
declare
v_txt varchar2(100);
begin
SELECT HR.JOBS into v_txt FROM dual;
dbms_output.put_line(v_txt);--打印的应该是jobs of pkg
end;
但实际结果不管在sql中还是pl/sql中都是jobs of pkg.











难道Oracle官方文档里说的是坑爹的啊?


哎不管它坑不坑爹,平时尽量注意别把对象名和schema名搞成一样,不然到时出问题了还不容易知道哪出错了,
我其实也不是喜欢钻语法的牛角尖来研究这问题,只是在工作中确实碰到了这问题,犯晕了好久才找到这蛋痛的原因啊.
我碰到这问题是这样一种场景下,我是使用FGA这功能,创建了些审计策略来记录所有schema的DML操作.审计策略中有调用到一个包中的函数,调用时包名前加了schema做前缀.这个前缀是必须得加的.因为在其他schema中做DML操作触发审计策略调用那函数时没schema前缀会找不到的。结果由于那些审计策略所在的schema中有个表名和schema名字相同,结果悲剧就出现了.所有schema做DML操作时触发了审计策略,然后又调用那函数,但调用时出错.这意味着所有schema的DML操作都不能完成了,也意味着差不多整个数据库算是没法用了,想一想这么严重的影响就流汗了,如果要是生产环境中被我这样一整,我估计会被骂死了啊........


编辑推荐

更多Oracle相关信息见 专题页面


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,