前言
做項(xiàng)目在Oracle數(shù)據(jù)庫(kù)里創(chuàng)建存儲(chǔ)過程時(shí),遇見了一個(gè)奇葩的問題:
創(chuàng)建了一個(gè)名為:PACK_KC_Check
存儲(chǔ)過程,編譯的時(shí)候,提示
對(duì)象 PACK_KC_CHECK 已經(jīng)刪除
刪除的時(shí)候
無(wú)論是PLSQL上手動(dòng)刪
還是調(diào)用SQL語(yǔ)句drop procedure PACK_KC_Check;
都提示
刪掉 PACK_KC_Check 錯(cuò)誤: ORA-04043: 對(duì)象 PACK_KC_CHECK 不存在
當(dāng)時(shí)為了趕項(xiàng)目,負(fù)責(zé)人讓先將這個(gè)放在一邊,重新創(chuàng)建了一個(gè)其他名字的存儲(chǔ)過程衫画,將就著用了。
項(xiàng)目完成后瓮栗,仔細(xì)分析削罩,終于解決,特此整理成文
提示:
** 本文詳細(xì)的描述了解決該問題的過程费奸,篇幅比較長(zhǎng)弥激,如果急需解決問題請(qǐng)直接跳到嘗試3
**
首先要知道
Oracle里,自動(dòng)將所有的字母做大寫處理
解決
該存儲(chǔ)過程為:
CREATE OR REPLACE PACKAGE "PACK_KC_Check"
as
type cur is ref cursor;
---====中間的具體存儲(chǔ)過程就不詳細(xì)描述了
end PACK_KC_Check;
1.嘗試方法1
遇見問題愿阐,當(dāng)然下意識(shí)的去搜索一下 ORA-04043微服,看到很多都說(shuō)是格式的問題,說(shuō)刪除的時(shí)候帶上""
就好了
即
drop procedure "PACK_KC_Check";
結(jié)果:嘗試之缨历,卒以蕴。
2.嘗試方法2
2.1.驗(yàn)證
因?yàn)閯h除時(shí)一直提示
刪掉 PACK_KC_Check 錯(cuò)誤: ORA-04043: 對(duì)象 PACK_KC_CHECK 不存在
所以肯定要驗(yàn)證一下,到底是不是存在該存儲(chǔ)過程辛孵,該存儲(chǔ)過程到底去哪了
SELECT * FROM USER_PROCEDURES ;
查詢?nèi)康拇鎯?chǔ)過程后丛肮,發(fā)現(xiàn),該存儲(chǔ)過程分明就存在
2.2.反思
能夠查詢到
該存儲(chǔ)過程魄缚,但是卻提示不存在
肯定是某個(gè)環(huán)節(jié)出錯(cuò)了
仔細(xì)對(duì)比了一下正常的存儲(chǔ)過程與該存儲(chǔ)過程的屬性
發(fā)現(xiàn)該存儲(chǔ)過程是INVALID(無(wú)效的)
編譯都沒通過宝与,
2.3修改
CREATE OR REPLACE PACKAGE "PACK_KC_Check"
as
type cur is ref cursor;
end "PACK_KC_Check";
2.4結(jié)果:編譯能夠通過,刪除仍然失敗
刪掉 PACK_KC_Check 錯(cuò)誤: ORA-04043: 對(duì)象 PACK_KC_CHECK 不存在
3.嘗試方法3
解決到現(xiàn)在鲜滩,有種只在此山中 云深不知處
的無(wú)奈
慢慢冷靜下來(lái)伴鳖,繼續(xù)看
刪除的提示是:
刪掉 PACK_KC_Check 錯(cuò)誤: ORA-04043: 對(duì)象 PACK_KC_CHECK 不存在
** 前后的大小寫不一樣!a愎琛0衲簟!IつⅰP胨痢D淠恕!M慊恪幢炸! **
創(chuàng)建存儲(chǔ)過程時(shí),因?yàn)榧由狭艘?hào)拒贱,所以大小寫敏感宛徊,數(shù)據(jù)庫(kù)中存儲(chǔ)的是
PACK_KC_Check
(有大寫有小寫),而刪除的時(shí)候,會(huì)自動(dòng)的將其大寫后再刪除逻澳,當(dāng)然就不存在了
再次修改
CREATE OR REPLACE PACKAGE "PACK_KC_CHECK"
as
type cur is ref cursor;
end "PACK_KC_CHECK";
刪除成功
總結(jié)
為避免因字母大小寫導(dǎo)致的問題闸天,在編寫存儲(chǔ)過程或其他有關(guān)命名時(shí)盡量直接就采用
大寫