sqlplus有相關(guān)的了命令:比如alter procedure prodedure_name compile;
創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元市南做網(wǎng)站,已為上家服務(wù),為市南各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
第一次編譯的時(shí)候只要在后面加一個(gè)/當(dāng)做執(zhí)行符號(hào),那么就可以進(jìn)行編譯。
Oracle中出現(xiàn)無(wú)效對(duì)象,就是因?yàn)樵趧?chuàng)建函數(shù)或存儲(chǔ)過(guò)程等,里邊的內(nèi)容書(shū)寫(xiě)不正確導(dǎo)致。如果要重新編譯,需要先修正錯(cuò)誤,然后編譯。
工具:Oracle 10g、PL/SQL
步驟:
1、在PL/SQL中打開(kāi)出現(xiàn)編譯錯(cuò)誤的函數(shù)或存儲(chǔ)過(guò)程,這里以存儲(chǔ)過(guò)程為例。
2、右鍵點(diǎn)擊該存儲(chǔ)過(guò)程,選擇“編輯”。
3、根據(jù)錯(cuò)誤提示,找到錯(cuò)誤,并修改錯(cuò)誤。
4、改正錯(cuò)誤后,點(diǎn)擊左上方的“齒輪”狀按鈕。
5、運(yùn)行成功后,則該存儲(chǔ)過(guò)程就會(huì)變?yōu)榫幾g成功的狀態(tài)。
一般情況下不會(huì)出現(xiàn)一個(gè)包編譯時(shí)間很長(zhǎng)的情況,出現(xiàn)何種情況一般是你的數(shù)據(jù)庫(kù)慢,可能是服務(wù)器慢,也可能是網(wǎng)絡(luò)慢,也可能是客戶端慢。
先看看數(shù)據(jù)庫(kù)現(xiàn)在在忙什么?如果現(xiàn)在數(shù)據(jù)庫(kù)真的很忙,或者數(shù)據(jù)庫(kù)出現(xiàn)要夯住的狀態(tài),其他的操作也慢,那么就要考慮數(shù)據(jù)庫(kù)的瓶頸了,這個(gè)分析起來(lái)就麻煩了。
如果僅僅編譯這個(gè)慢,其他的不那么慢,那么可能是你的機(jī)器的問(wèn)題,換一臺(tái)試試,有時(shí)可能你的這個(gè)用戶操作過(guò)多,或者過(guò)長(zhǎng)時(shí)間不操作,導(dǎo)致進(jìn)程假死,這個(gè)也是有可能發(fā)生的。另外看看,是不是有人也在操作這個(gè)包,如果是的話,那么編譯確實(shí)很慢。
如果是網(wǎng)絡(luò)慢,或者服務(wù)器慢,那么就幾乎真的沒(méi)辦法了,數(shù)據(jù)庫(kù)工程師如果對(duì)系統(tǒng)較熟悉的可以找找看問(wèn)題,不過(guò)真的沒(méi)啥可以改的。
如果就是因?yàn)榉?wù)器不行,包太大,那么就分包,把一個(gè)包變成兩個(gè),標(biāo)_1和_2,或者_(dá)A,_B唄。
//通過(guò)編寫(xiě)的連接類(lèi)創(chuàng)建一個(gè)連接
dbconn db = new dbconn();
Connection con1 = db.conn;
String callSQL1 = new String();
ResultSet rs1 = null;
//創(chuàng)建一個(gè)CallableStatement變量st1來(lái)調(diào)用存儲(chǔ)過(guò)程信息
CallableStatement st1 = null;
try {
st1 = con1.prepareCall("{ call p(?,?,?,?) }");
st1.setString(1, "參數(shù)1");
st1.setString(2, "參數(shù)2");
st1.setString(3, "參數(shù)3");
st1.registerOutParameter(4,Types.INTEGER); //此處4 代表第一個(gè)"?" 則表示存儲(chǔ)過(guò)程返回的值 這里要注意Types的類(lèi)型,當(dāng)需要有返回值時(shí)
st1.execute();
System.out.println(st1.getInt(4));//輸出存儲(chǔ)過(guò)程的返回值,當(dāng)有返回值時(shí)
} catch (Exception error) {
try {
con1.rollback(); //操作不成功則回退
} catch (Exception ex9) {
ex9.printStackTrace();
}
out.print("系統(tǒng)出錯(cuò)" + error.getMessage());
} finally {
try {
if (st1 != null) {
st1.close();
}
} catch (Exception error) {
}
db.disconnect();
}
編譯的存儲(chǔ)過(guò)程的時(shí)候,程序死住,等待一會(huì)出現(xiàn)ora-04021錯(cuò)誤解決辦法:
1.可能被鎖住
查看v$lockedselect b.sid,b.serial#,b.machine,b.terminal,b.program,b.process,b.status from v$lock a , v$session b
where a.SID = b.SID
得到死鎖session的SID,SERIAL#參看這個(gè)是否為你自己用戶下的,然后kill掉session
2.可能被掛起
查看v$session_waitselect b.serial#,a.* from v$session_wait a,v$session
bwhere a.sid = b.sid得到等待的session的sid和serial#3.查看dba_ddl_locksselect
session_id sid, owner, name, type,
mode_held held, mode_requested request
from dba_ddl_locks
where name = 'your_package_name'