前言
做项目在Oracle数据库里创建存储过程时,遇见了一个奇葩的问题:
创建了一个名为:PACK_KC_Check
存储过程,编译的时候,提示
对象 PACK_KC_CHECK 已经删除
删除的时候
无论是PLsql上手动删
还是调用sql语句drop procedure PACK_KC_Check;
都提示
当时为了赶项目,负责人让先将这个放在一边,重新创建了一个其他名字的存储过程,将就着用了。
项目完成后,仔细分析,终于解决,特此整理成文
提示:
* 本文详细的描述了解决该问题的过程,篇幅比较长,如果急需解决问题请直接跳到尝试3
*
首先要知道
Oracle里,自动将所有的字母做大写处理
解决
该存储过程为:
CREATE OR REPLACE PACKAGE "PACK_KC_Check" as type cur is ref cursor;
---====中间的具体存储过程就不详细描述了
end PACK_KC_Check;
1.尝试方法1
遇见问题,当然下意识的去搜索一下 ORA-04043,看到很多都说是格式的问题,说删除的时候带上""
就好了
即
drop procedure “PACK_KC_Check”;
结果:尝试之,卒。
2.尝试方法2
2.1.验证
所以肯定要验证一下,到底是不是存在该存储过程,该存储过程到底去哪了
SELECT * FROM USER_PROCEDURES ;
查询全部的存储过程后,发现,该存储过程分明就存在
2.2.反思
肯定是某个环节出错了
仔细对比了一下正常的存储过程与该存储过程的属性
发现该存储过程是INVALID(无效的)
编译都没通过,
2.3修改
CREATE OR REPLACE PACKAGE "PACK_KC_Check" as type cur is ref cursor;
end "PACK_KC_Check";
2.4结果:编译能够通过,删除仍然失败
3.尝试方法3
解决到现在,有种只在此山中 云深不知处
的无奈
慢慢冷静下来,继续看
* 前后的大小写不一样!!!!!!!!!! *
创建存储过程时,因为加上了引号,所以大小写敏感,数据库中存储的是
PACK_KC_Check
(有大写有小写),而删除的时候,会自动的将其大写后再删除,当然就不存在了
再次修改
CREATE OR REPLACE PACKAGE "PACK_KC_CHECK" as type cur is ref cursor;
end "PACK_KC_CHECK";
删除成功
总结
为避免因字母大小写导致的问题,在编写存储过程或其他有关命名时尽量直接就采用
大写