ORA-04043艰难的解决之路

来源:互联网 发布:java 图片上传 base64 编辑:程序博客网 时间:2024/04/30 18:27

前言

做项目在Oracle数据库里创建存储过程时,遇见了一个奇葩的问题:

创建了一个名为:PACK_KC_Check 存储过程,编译的时候,提示

对象 PACK_KC_CHECK 已经删除

删除的时候

无论是PLSQL上手动删
还是调用SQL语句drop procedure PACK_KC_Check;都提示

删掉 PACK_KC_Check 错误: ORA-04043: 对象 PACK_KC_CHECK 不存在

当时为了赶项目,负责人让先将这个放在一边,重新创建了一个其他名字的存储过程,将就着用了。

项目完成后,仔细分析,终于解决,特此整理成文

提示:

* 本文详细的描述了解决该问题的过程,篇幅比较长,如果急需解决问题请直接跳到尝试3 *


首先要知道

Oracle里,自动将所有的字母做大写处理


解决

该存储过程为:

CREATE OR REPLACE PACKAGE "PACK_KC_Check"astype cur is ref cursor;---====中间的具体存储过程就不详细描述了end PACK_KC_Check;

1.尝试方法1

遇见问题,当然下意识的去搜索一下 ORA-04043,看到很多都说是格式的问题,说删除的时候带上""就好了

drop procedure “PACK_KC_Check”;

结果:尝试之,卒。


2.尝试方法2

2.1.验证

因为删除时一直提示

删掉 PACK_KC_Check 错误: ORA-04043: 对象 PACK_KC_CHECK 不存在

所以肯定要验证一下,到底是不是存在该存储过程,该存储过程到底去哪了

SELECT * FROM USER_PROCEDURES ;

查询全部的存储过程后,发现,该存储过程分明就存在

2.2.反思

能够查询到该存储过程,但是却提示不存在

肯定是某个环节出错了

仔细对比了一下正常的存储过程与该存储过程的属性

发现该存储过程是INVALID(无效的)
编译都没通过,

2.3修改

CREATE OR REPLACE PACKAGE "PACK_KC_Check"astype cur is ref cursor;end "PACK_KC_Check";

2.4结果:编译能够通过,删除仍然失败

删掉 PACK_KC_Check 错误: ORA-04043: 对象 PACK_KC_CHECK 不存在


3.尝试方法3

解决到现在,有种只在此山中 云深不知处的无奈

慢慢冷静下来,继续看

删除的提示是:

删掉 PACK_KC_Check 错误: ORA-04043: 对象 PACK_KC_CHECK 不存在

* 前后的大小写不一样!!!!!!!!!! *

创建存储过程时,因为加上了引号,所以大小写敏感,数据库中存储的是PACK_KC_Check(有大写有小写),而删除的时候,会自动的将其大写后再删除,当然就不存在了

再次修改

CREATE OR REPLACE PACKAGE "PACK_KC_CHECK"astype cur is ref cursor;end "PACK_KC_CHECK";

删除成功


总结

为避免因字母大小写导致的问题,在编写存储过程或其他有关命名时尽量直接就采用大写

0 0
原创粉丝点击