十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
:在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;最后执行:exec Zl_Compile_Invalid_Procedure;如果要看到无法重编译的过程的出错信息,需要执行前设置set serverout on。
创新互联建站主要从事成都网站制作、做网站、外贸营销网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务沙河,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
个人观点:
1 last_ddl_time就是指最后一次编译的时间。 你认为的create or replace 其实就是一种编译
2 A调用B引发的B的重新编译。
我认为A调用B是不会引起B的编译的。从2个方面解释:
1) 我个人工作经验中没有发现A调用B会让B重新编译。
案例:B中引用了一张表。我将表删除了,编译B。那么B出现了错误。此时我又将表还原了。再去编译A。注意:A中调用B。但是B是错误的。如果调用B让B也编译的话,那么B会编译通过,A没问题。事实上:由于B的错误,导致A编译也错误。可见B并没有编译。
2)存储过程的一个优点是什么?就是一次编译,到处运行。这个编译时比较消耗资源的。从常理上讲,如果每次调用A引发了B的编译,那么存储过程的上述的优点浩然无存。所以从常理推断,A调用B不会引发B的编译。
---------------------------------- -----------------------------------------
早上看到了你昨晚发的信息。尝试了下。你的结论是有一半是正确的。
正确的解释应该是:
1 假设A、B都是正确的 那么调用的时候无需编译;
2 假设A、B是无效的。那么调用的时候会去编译它。
Oracle会自己判断A、B是否有效,再根据情况决定是否去编译。
如果无效对象的数量很少,那么你可以逐个编译这些对象.
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;
编译完成,不代表里面语句没问题,这种情况是存储过程里存在某种错误
在 SQL *Plus 或者 PL/SQL Developer 的 Command Windows 中,执行
show errors procedure USP_EXCEPTION;
查看一下错误是什么.
我的修改如下:
CREATE OR REPLACE PROCEDURE USP_EXCEPTION(EMPNO INTEGER, --批次ID
P_FM NUMBER, --分母
P_FZ NUMBER, --分子
P_RESULT OUT NUMBER --结果
) 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:批次明细不存在!');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20012, 'ERROR:数据错误!');
END;
1、你的存储过程有错误,编译不通过。处理于无效状态。2、问题 存储过程中隐式游标的select 语句必须要有into子句。 而 select * from temp_syckzl_zy 这是一个没有意义的语句; 应改为如:select col1 into v_col1 from temp_syckzl_zy; 注:col1为表中一字段,v_col1为一变量