個人觀點:

創(chuàng)新互聯(lián)長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為長豐企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站設(shè)計,長豐網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
1 last_ddl_time就是指最后一次編譯的時間。 你認(rèn)為的create or replace 其實就是一種編譯
2 A調(diào)用B引發(fā)的B的重新編譯。
我認(rèn)為A調(diào)用B是不會引起B(yǎng)的編譯的。從2個方面解釋:
1) 我個人工作經(jīng)驗中沒有發(fā)現(xiàn)A調(diào)用B會讓B重新編譯。
案例:B中引用了一張表。我將表刪除了,編譯B。那么B出現(xiàn)了錯誤。此時我又將表還原了。再去編譯A。注意:A中調(diào)用B。但是B是錯誤的。如果調(diào)用B讓B也編譯的話,那么B會編譯通過,A沒問題。事實上:由于B的錯誤,導(dǎo)致A編譯也錯誤。可見B并沒有編譯。
2)存儲過程的一個優(yōu)點是什么?就是一次編譯,到處運(yùn)行。這個編譯時比較消耗資源的。從常理上講,如果每次調(diào)用A引發(fā)了B的編譯,那么存儲過程的上述的優(yōu)點浩然無存。所以從常理推斷,A調(diào)用B不會引發(fā)B的編譯。
---------------------------------- -----------------------------------------
早上看到了你昨晚發(fā)的信息。嘗試了下。你的結(jié)論是有一半是正確的。
正確的解釋應(yīng)該是:
1 假設(shè)A、B都是正確的 那么調(diào)用的時候無需編譯;
2 假設(shè)A、B是無效的。那么調(diào)用的時候會去編譯它。
Oracle會自己判斷A、B是否有效,再根據(jù)情況決定是否去編譯。
編譯完成,不代表里面語句沒問題,這種情況是存儲過程里存在某種錯誤
在 SQL *Plus 或者 PL/SQL Developer 的 Command Windows 中,執(zhí)行
show errors procedure USP_EXCEPTION;
查看一下錯誤是什么.
我的修改如下:
CREATE OR REPLACE PROCEDURE USP_EXCEPTION(EMPNO INTEGER, --批次ID
P_FM NUMBER, --分母
P_FZ NUMBER, --分子
P_RESULT OUT NUMBER --結(jié)果
) IS
V_RAISE EXCEPTION; --異常處理
type type_table_pcmx is varray(4) of varchar2(20);
TABLE_PCMX type_table_pcmx;
BEGIN
IF P_FZ = 0 THEN
RAISE V_RAISE;
END IF;
P_RESULT := P_FM / P_FZ;
SELECT ENAME, EMPNO, JOB, DEPTNO
INTO TABLE_PCMX(1),TABLE_PCMX(2),TABLE_PCMX(3),TABLE_PCMX(4)
FROM EMP
WHERE EMPNO = EMPNO;
EXCEPTION
WHEN V_RAISE THEN
RAISE_APPLICATION_ERROR(-20010, 'ERROR:分子為零!');
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20011, 'ERROR:批次明細(xì)不存在!');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20012, 'ERROR:數(shù)據(jù)錯誤!');
END;
如果無效對象的數(shù)量很少,那么你可以逐個編譯這些對象.
ALTER PACKAGE my_package COMPILE;
ALTER PACKAGE my_package COMPILE BODY;
ALTER PROCEDURE my_procedure COMPILE;
ALTER FUNCTION my_function COMPILE;
ALTER TRIGGER my_trigger COMPILE;
ALTER VIEW my_view COMPILE;
無效狀態(tài)有兩種可能:
1、一種是你的存儲過程編輯沒有成功,創(chuàng)建了,但里面有語法錯誤。
2、還有一種是存儲過程使用的表有結(jié)構(gòu)上的改變,需要重新編譯一下。
解決方法如下:
重新編譯一下,如果不成功,就是有語法問題,你需要修改存儲過程。
延展閱讀:
修改存儲過程的操作:在你的存儲過程,鼠標(biāo)右鍵,點修改,再保存就行了。
1、你的存儲過程有錯誤,編譯不通過。處理于無效狀態(tài)。2、問題 存儲過程中隱式游標(biāo)的select 語句必須要有into子句。 而 select * from temp_syckzl_zy 這是一個沒有意義的語句; 應(yīng)改為如:select col1 into v_col1 from temp_syckzl_zy; 注:col1為表中一字段,v_col1為一變量
:在SQL_PLUS中:spool ExecCompProc.sql select 'alter procedure ' ||object_name||' compile;' From all_objects where status = 'INVALID' and object_type = 'PROCEDURE'; spool off @ExecCompProc.Sql;整理成一個存儲過程:Create Or Replace Procedure Zl_Compile_Invalid_Procedure AsStrsql Varchar2(200);BeginFor x In (Select Object_Name From All_Objects Where Status = 'INVALID' And Object_Type = 'PROCEDURE') LoopStrsql := 'Alter Procedure ' || x.Object_Name || ' Compile';Begin Execute Immediate Strsql; Exception--When Others Then Null; When OTHERS Then dbms_output.put_line(Sqlerrm); End;End Loop;End;最后執(zhí)行:exec Zl_Compile_Invalid_Procedure;如果要看到無法重編譯的過程的出錯信息,需要執(zhí)行前設(shè)置set serverout on。
分享標(biāo)題:oracle怎么編譯無效 oracle重新編譯失效對象
分享URL:http://chinadenli.net/article48/hijohp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、網(wǎng)站策劃、域名注冊、自適應(yīng)網(wǎng)站、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)