刚碰到一个问题:我们测试库中有一个包体名称为"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工具开发的时候,这是很容易出现的问题。