Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1693673
  • 博文数量: 136
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3261
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-22 11:26
文章分类

全部博文(136)

文章存档

2010年(1)

2009年(26)

2008年(109)

我的朋友

分类: Oracle

2008-03-07 20:09:07

刚碰到一个问题:我们测试库中有一个包体名称为"PKG_A_RYBG_szgs",同时还存在一个包体"PKG_A_RYBG_SZGS"。它们的创建方式如下:
 
CREATE OR REPLACE PACKAGE BODY "PKG_A_RYBG_szgs" AS
...
 
CREATE OR REPLACE PACKAGE BODY "PKG_A_RYBG_SZJG" AS
...
 
数据库中出现了两个“同名”的包,我要删除一个!但执行DROP后,只能删除第二个,第一个一直无法删除,即使在PL/SQL Developer中点右键删除也是如此。
是Oracle的错吗?当然不是!
 
错误原因:这些对象(objects)默认在数据字典中是按照大写方式存储的,但双引号可以改变这种默认关系。上面例子中,确实在数据字典中存在两个过程,并且名称是不一样的。
 
我们举个小例子:
SQL> create table test1(a varchar2(1));
 
表已创建。
 
SQL> desc test1
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ---------------------------
 A                                                  VARCHAR2(1)
 
SQL> alter table test1 add "a" varchar2(1);
 
表已更改。
 
SQL> desc test1;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ---------------------------
 A                                                  VARCHAR2(1)
 a                                                  VARCHAR2(1)
 
SQL> create table "test1"(a varchar2(1));
 
表已创建。
 
SQL> create table "Test1"(a varchar2(1));
 
表已创建。
 
SQL> insert into test1 values(1,1);
 
已创建 1 行。
 
SQL> insert into "test1" values(2);
 
已创建 1 行。
 
SQL> insert into "Test1" values(3);
 
已创建 1 行。
 
SQL> select * from test1;
 
A a
- -
1 1
 
SQL> select * from "test1";
 
A
-
2
 
SQL> select * from "Test1";
 
A
-
3
 
SQL> drop table test1;
 
表已丢弃。
 
SQL> drop table "test1";
 
表已丢弃。
 
SQL> drop table "Test1";
 
表已丢弃。
 
SQL>
上面的存储过程的原因就是如此,所以drop的时候,其实是给drop掉那个大写的过程了,因为使用的命令是:
drop package body pkg_a_rybg_szgs;
而不是:
drop package body "PKG_A_RYBG_szgs";
 
不止表、列、存储过程,其他对象也是如此。所以大家要注意,在创建数据库对象的时候,最好不要带有双引号。而使用PL/SQL Developer工具开发的时候,这是很容易出现的问题。
阅读(2093) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Oracel 10g 的数据库闪回测试

给主人留下些什么吧!~~