个人观点:
①. last_ddl_time就是指最后一次编译的时间. 你认为的create or replace 其实就是一种编译
①.) 我个人工作经验中没有发现A调用B会让B重新编译.
案例:B中引用了一张表.我将表删除了,编译B.那么B出现了错误.此时我又将表还原了.再去编译A.注意:A中调用B.但是B是错误的.如果调用B让B也编译的话,那么B会编译通过,A没问题.事实上:由于B的错误,导致A编译也错误.可见B并没有编译.
---------------------------------- -----------------------------------------
早上看到了你昨晚发的信息.尝试了下.你的结论是有一半是正确的.
正确的解释应该是:
①. 假设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; --异常处理
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
FROM EMP
WHERE EMPNO = EMPNO;
EXCEPTION
WHEN V_RAISE THEN
WHEN NO_DATA_FOUND THEN
WHEN OTHERS THEN
END;
以上就是土嘎嘎小编为大家整理的oracle怎么编译无效相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!