Oracle Schema名字和Object名字相同时带来的问题
2012-05-10 18:08
232 查看
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,(没有参数,返回字符串'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操作都不能完成了,也意味着差不多整个数据库算是没法用了,想一想这么严重的影响就流汗了,如果要是生产环境中被我这样一整,我估计会被骂死了啊........
有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,(没有参数,返回字符串'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 游标提取值与表内列名相同引发的问题
- ORACLE 11G利用ACS解决bind peeking带来的问题
- Spring mvc 前端表单传递来的数据被后台的两个entity的相同名字的属性谁获取的问题
- Oracle的实例、表空间、用户、数据库、Schema结构和一个实际问题
- oracle 更新相同表问题
- oracle 安装过程中遇到的问题1: libXp.so.6: cannot open shared objectfile: No such file or directory
- oracle更换表空间 blob字段带来的问题
- 删除SDE.DBF所带来的影响oracle的问题
- Oracle中排序列中值相同引发的问题(译)
- 注意使用PowerDesigner 生成 Oracle表时候带来的问题
- oracle plsql表名字汉字乱码问题
- oracle 构造与已知表结构相同的表问题
- oracle读不阻塞写带来的问题
- 用户自定义的Javascript函数名字与内置函数或宿主函数名字相同时产生的问题。
- 关于Oracle创建存储过程时,访问不同Schema下的表报错:ORA-00942的问题
- oracle schema object
- Oracle 排序问题(null带来的)
- Oracle 11G RAC 本地时间和通过listener连接时间不相同的问题
- 删除 SDE.DBF 所带来的ORA-01033: ORACLE initialization or shutdown in progress错误问题
- 解决MVC2里不能使用相同Action名字的问题(与HttpVerbs无关)