各位Oracle大侠怎么不回音啊?

解决方案 »

  1.   

    不如写个job自动编译失效的trigger
    下面这个procedure我就用job自动跑。CREATE OR REPLACE PROCEDURE Compile_Invalid_Trigger
    AS
      CURSOR c1
        IS SELECT * FROM user_objects WHERE status='INVALID' AND object_type = 'TRIGGER';
      l_c1 c1%ROWTYPE;
      sql_str VARCHAR2(200);
      sql_code VARCHAR2(15);
      sql_errtxt VARCHAR2(100);
    --   TRIGGER和PROCEDURE失效很有可能是所涉及到的对象被改变
    --   需要重新编译或者修改
    --  本过程试着找寻出无效的trigger并且自动重新编译
    --  若编译无法通过再发出警告
    BEGIN 
      OPEN c1;
      LOOP
        FETCH c1 INTO l_c1;
        EXIT WHEN c1%NOTFOUND;
        sql_str:='alter ' || l_c1.object_type|| '  ' ||l_c1.object_name||' compile';
        EXECUTE IMMEDIATE sql_str;
      sql_code:=SQLCODE;
      sql_errtxt:=SUBSTR(SQLERRM,1,100);
      INSERT INTO TRIGGER_INVALID_LOG_LIULF 
      VALUES(p_date,l_c1.object_name,sql_code,sql_errtxt,0);
      COMMIT;
      END LOOP;
      CLOSE c1;
      EXCEPTION
        WHEN OTHERS THEN
      sql_code:=SQLCODE;
      sql_errtxt:=SUBSTR(SQLERRM,1,100);
      INSERT INTO TRIGGER_INVALID_LOG_LIULF 
      VALUES(p_date,l_c1.object_name,sql_code,sql_errtxt,1);
      COMMIT; 
    END;
    /
      

  2.   

    在对表进行修改时,Oracle会自动把依附在这些对象上的存储过程,出发器等对象标记为无效.
    等下一次执行这些对象的时候,Oracle会自动重新编译它们.
      

  3.   

    存储过程或者触发器失效原因我记得有2个:
    一、存储过程(触发器)关联到的对象有过变动,比如先drop再create。
    还有一个忘记是什么原因了。我一般都是ALKEEN一样处理,自己写一个job定时编译失效的对象