1. 程式人生 > >oracle--ORA:04091:觸發器/函式不能讀它

oracle--ORA:04091:觸發器/函式不能讀它

第一次寫觸發器,就有bug了

   前臺用ajax儲存使用者的修改和刪除,這時需求要加個觸發器,在修改和刪除時修改其他表的欄位,加完觸發器,點儲存,前臺彈出js錯誤,以為是js寫的有誤,結果查了半天js發現是ajax返回是出錯。

   後臺則為:2012-02-28 13:05:11,960 WARN [http-8080-Processor23] [RequestProcessor] Unhandled Exception thrown: class org.springframework.jdbc.BadSqlGrammarException。

    原來還是觸發器有問題,用PL/SQL寫的觸發器,沒有測試,最後不用程式單走觸發器,測試了一下觸發器,發現提示錯誤資訊為:ora-04091:表TB_JDF_XC.....發生了變化,觸發器/函式不能讀它。

    寫的觸發器如下:用PL/SQL developer寫的觸發器

    CREATE OR REPLACE TRIGGER TB_PER_POSITONLEVEL_TRI

Sql程式碼  收藏程式碼
  1. <span><span><span>AFTER INSERT OR UPDATE OF c_effectivedate,c_postionlevel,c_postioncluster OR DELETE ON TB_PER_POSITONLEVEL   
  2. FOR EACH ROW  
  3. BEGIN  
  4.      IF inserting THEN  
  5.         UPDATE
     tb_inf_employee t SET t.c_positionlevel = ( SELECT c_postionlevel FROM (SELECT a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY a.c_effectivedate DESC,a.c_operatetime DESCWHERE ROWNUM =1 ),  
  6.                                      t.c_positionorder = ( SELECT
     c_postioncluster FROM (SELECT a.c_postioncluster FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY a.c_effectivedate DESC,a.c_operatetime DESCWHERE ROWNUM =1 );  
  7.      END IF;  
  8.      IF deleting THEN  
  9.         UPDATE tb_inf_employee t SET t.c_positionlevel = ( SELECT c_postionlevel FROM (SELECT a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid ORDER BY a.c_effectivedate DESC,a.c_operatetime DESCWHERE ROWNUM =1 ),  
  10.                                      t.c_positionorder = ( SELECT c_postioncluster FROM (SELECT a.c_postioncluster FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid ORDER BY a.c_effectivedate DESC,a.c_operatetime DESCWHERE ROWNUM =1 );  
  11.      END IF;  
  12.      IF UPDATing THEN  
  13.         UPDATE tb_inf_employee t SET t.c_positionlevel = ( SELECT c_postionlevel FROM (SELECT a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid ORDER BY a.c_effectivedate DESC,a.c_operatetime DESCWHERE ROWNUM =1 ),  
  14.                                      t.c_positionorder = ( SELECT c_postioncluster FROM (SELECT a.c_postioncluster FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid ORDER BY a.c_effectivedate DESC,a.c_operatetime DESCWHERE ROWNUM =1 );  
  15.      END IF;                                 
  16. END TB_PER_POSITONLEVEL_TRI;</span></span></span>  

--手動 insert update delete測試

SELECT * FROM TB_PER_POSITONLEVEl r WHERE r.c_empoid = '853949' FOR UPDATE --853949

SELECT * FROM tb_inf_employee t WHERE t.c_employeeid = '853949'

   上網搜尋了一天觸發器,答案不給力,後來搜尋ORA-04091有了眉目,以後oracle的問題,直接搜尋問題編號就好了

   結果如下:程式碼涉及到對關聯表的資料操作,比如查詢關聯表的總記錄數或者往關聯表中插入一條記錄,該型別程式碼只能在語句級觸發器中使用,如果在行級觸發器中使用,將會報ORA-04091錯誤oracle的意思是要是涉及子查詢說明你資料庫設計上就有問題!

   那我又要用行級觸發器咋麼辦呢?

方法一:新建了與orginfo結構完全相同的臨時表tmp_orginfo,使得在orginfo上的觸發器讀寫tmp_orginfo,再用tmp_orginfo上的觸發器寫回orginfo,解決ora-04091問題。

方法二:開啟自治事務

   oracle行級觸發器無法讀取當前表的資料,為達到操作本表的效果建議開啟自治事務
create or replace trigger TRI_ACTION_LOG

after insert on action_log
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
co integer;
begin
    select count(1) into co from action_log;
    :new.log_state:=co;
    insert into action_log(log_state)
    values(:New.log_state);
    commit;
end; 把子查詢放到中間變數裡面,並用自治事務修改如下:

   CREATE OR REPLACE TRIGGER TB_PER_POSITONLEVEL_TRI

AFTER INSERT OR UPDATE OF c_effectivedate,c_postionlevel,c_postioncluster OR DELETE ON TB_PER_POSITONLEVEL

FOR EACH ROW

DECLARE

position_effdate DATE;

position_level varchar2(64);

position_order varchar2(64);

position_oid varchar2(128);

cou NUMBER(3);

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

     --SELECT COUNT(*) INTO cou FROM (SELECT a.c_oid FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC);

     --INSERT INTO A_TEMP VALUES(cou);

     IF inserting THEN

        SELECT COUNT(*) INTO cou FROM (SELECT a.c_oid FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC);

       -- INSERT INTO A_TEMP VALUES('行級別觸發器after');

        --INSERT INTO A_TEMP VALUES(position_oid);

        --INSERT INTO A_TEMP VALUES( to_char(position_effdate,'fmdd month yyyy') );

        --INSERT INTO A_TEMP VALUES(position_level);

        --INSERT INTO A_TEMP VALUES(position_order);

        --INSERT INTO A_TEMP VALUES(cou);

        IF cou <> 0 THEN

           SELECT CASE WHEN :new.c_oid = c_oid THEN :NEW.c_postionlevel ELSE c_postionlevel END INTO position_level FROM (SELECT a.c_oid, a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC)  WHERE ROWNUM =1 ;

           SELECT CASE WHEN :new.c_oid = c_oid THEN :NEW.c_effectivedate ELSE c_effectivedate END INTO position_effdate FROM (SELECT a.c_oid,a.c_effectivedate FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

           SELECT CASE WHEN :new.c_oid = c_oid THEN :new.c_postioncluster ELSE c_postioncluster END INTO position_order FROM (SELECT a.c_oid,a.c_postioncluster FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

           SELECT c_oid INTO position_oid FROM (SELECT a.c_oid FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

           IF position_effdate <= :NEW.c_effectivedate THEN

              --INSERT INTO A_TEMP VALUES('插入的是最新的');

              UPDATE tb_inf_employee t SET t.c_positionlevel = :NEW.c_postionlevel,

                                      t.c_positionorder = :NEW.c_postioncluster WHERE t.c_employeeid = :NEW.C_EMPOID;

            END IF;

            ELSIF position_effdate > :NEW.c_effectivedate THEN

              --INSERT INTO A_TEMP VALUES('插入的不是最新的,沒有影響');

              UPDATE tb_inf_employee t SET t.c_positionlevel = position_level,

                                      t.c_positionorder = position_order WHERE t.c_employeeid = :NEW.C_EMPOID;

            END IF;

        END IF;

        IF cou = 0 THEN

           UPDATE tb_inf_employee t SET t.c_positionlevel = :NEW.c_postionlevel,

                                      t.c_positionorder = :NEW.c_postioncluster WHERE t.c_employeeid = :NEW.C_EMPOID;

        END IF;

     IF deleting THEN

        SELECT COUNT(*) INTO cou FROM (SELECT a.c_oid FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC);

       -- INSERT INTO A_TEMP VALUES('行級別觸發器after');

        --INSERT INTO A_TEMP VALUES(position_oid);

       -- INSERT INTO A_TEMP VALUES( to_char(position_effdate,'fmdd month yyyy') );

       -- INSERT INTO A_TEMP VALUES(position_level);

        --INSERT INTO A_TEMP VALUES(position_order);

      --  IF(:OLD.c_oid == )

        IF cou <> 1 THEN

        SELECT c_postionlevel INTO position_level FROM (SELECT a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid AND a.c_oid <> :old.c_oid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

        SELECT c_effectivedate INTO position_effdate FROM (SELECT a.c_effectivedate FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid AND a.c_oid <> :old.c_oid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

        SELECT c_postioncluster INTO position_order FROM (SELECT a.c_postioncluster FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid AND a.c_oid <> :old.c_oid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

        SELECT c_oid INTO position_oid FROM (SELECT a.c_oid FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :OLD.c_empoid AND a.c_oid <> :old.c_oid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

        UPDATE tb_inf_employee t SET t.c_positionlevel = position_level,

                                     t.c_positionorder = position_order WHERE t.c_employeeid = :OLD.C_EMPOID;

        END IF;

        IF cou = 1 THEN

        UPDATE tb_inf_employee t SET t.c_positionlevel = '',

                                     t.c_positionorder = '' WHERE t.c_employeeid = :OLD.C_EMPOID;

        END IF;

     END IF;

     IF UPDATing THEN

        SELECT CASE WHEN :new.c_oid = c_oid THEN :NEW.c_postionlevel ELSE c_postionlevel END INTO position_level FROM (SELECT a.c_oid, a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC)  WHERE ROWNUM =1 ;

        SELECT CASE WHEN :new.c_oid = c_oid THEN :NEW.c_effectivedate ELSE c_effectivedate END INTO position_effdate FROM (SELECT a.c_oid,a.c_effectivedate FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

        SELECT CASE WHEN :new.c_oid = c_oid THEN :new.c_postioncluster ELSE c_postioncluster END INTO position_order FROM (SELECT a.c_oid,a.c_postioncluster FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

        SELECT c_oid INTO position_oid FROM (SELECT a.c_oid FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC) WHERE ROWNUM =1 ;

        --INSERT INTO A_TEMP VALUES('行級別觸發器after');

        --INSERT INTO A_TEMP VALUES(position_oid);

       -- INSERT INTO A_TEMP VALUES( to_char(position_effdate,'fmdd month yyyy') );

       -- INSERT INTO A_TEMP VALUES(position_level);

       -- INSERT INTO A_TEMP VALUES(position_order);

        UPDATE tb_inf_employee t SET t.c_positionlevel = position_level,

                                     t.c_positionorder = position_order WHERE t.c_employeeid = :NEW.C_EMPOID;

     END IF;

    COMMIT;

END TB_PER_POSITONLEVEL_TRI;

--測試

SELECT * FROM TB_PER_POSITONLEVEl r WHERE r.c_empoid = '853949' FOR UPDATE --853949

INSERT INTO TB_PER_POSITONLEVEl(c_oid,c_empoid,c_effectivedate)  VALUES('22','853949',to_date('2012-02-10','yyyy-mm-dd'));

DELETE FROM TB_PER_POSITONLEVEl WHERE c_empoid = '853949' AND c_oid = '22'

SELECT t.c_positionlevel,t.c_positionorder FROM tb_inf_employee t WHERE t.c_employeeid = '853949'

UPDATE tb_inf_employee t SET t.c_positionlevel = '11',

                                     t.c_positionorder = '11' WHERE t.c_employeeid = '853949';

SELECT a.c_postioncluster FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = '853949' ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC

SELECT a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = '853949' ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC

SELECT * FROM A_TEMP

DELETE FROM a_temp WHERE 1 = 1  

    結果發現這裡的子查詢的結果不包括已經修改的記錄,就是說before和after在查詢關聯表的情況下是沒有區別的,不知道是怎麼個情況,就不包括正在crud的那條記錄去掉自治事務,則報錯ora:04091,後來又加了一個額外的判斷看把查詢出來的結果和new、old比較,判斷是否修改的是要查的記錄。

SELECT CASE WHEN :new.c_oid = c_oid THEN :NEW.c_postionlevel ELSE c_postionlevel END INTO position_level FROM (SELECT a.c_oid, a.c_postionlevel FROM TB_PER_POSITONLEVEl a,tb_inf_employee b WHERE a.c_empoid = b.c_employeeid AND  a.c_empoid = :NEW.c_empoid ORDER BY nvl(a.C_EFFECTIVEDATE,TO_DATE('1900/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') ) DESC,a.c_operatetime DESC)  WHERE ROWNUM =1 ;

    暫時能用了,不過應該寫的很不規範。以後在研究吧。

    問題分析:就目前的線索來說,在觸發器中不讓用關聯表使用子查詢,mutating table(估計是正在修改的那條記錄沒有提交呢!!),要是非要這麼用,就用自治事務,這時要注意,無論before,after都是不包括正在crud的那條記錄,這說明其實觸發器的執行過程中after和before其實都沒有實際的更新資料庫,crud操作和觸發器body是在同一個事務中的,after是(crud、觸發器body commit的順序),before是(觸發器body、crud commit的順序)。都是最後一起提交事務,所謂before和after是說在同一個事務中的先後順序罷了。採用自治事務after應該能達到先crud、在子查詢中應該能查到剛才crud的那條記錄的,可是實際情況是沒有那條記錄,這說明oracle在實現觸發器的時候有內部的一套機制,需要深入研究才行,目前開發階段不涉及,以後有時間再研究吧。

相關推薦

oracle--ORA:04091觸發器/函式不能

第一次寫觸發器,就有bug了    前臺用ajax儲存使用者的修改和刪除,這時需求要加個觸發器,在修改和刪除時修改其他表的欄位,加完觸發器,點儲存,前臺彈出js錯誤,以為是js寫的有誤,結果查了半天js發現是ajax返回是出錯。    後臺則為:2012-02-28

ORA-04091表XX發生了變化,觸發器/函式不能

--廢話不多說,直接看程式碼 -----第一個觸發器 CREATE OR REPLACE TRIGGER tri_id_seq_do_386_action--車險政策主表狀態修改時關聯修改子表狀態 AFTER UPDATE ON do_table_386 FOR EACH

Oracle新增用戶登錄提示“ORA-04098觸發器‘GD.ON_LOGON_TRIGGER’無效且未通過重新驗證”

begin sql dbms ont env 用戶 database 環境 objects 接著上一篇創建一個只有查看權限的用戶,在測試環境,新建賬號後嘗試登錄,提示如下: 1.看提示是base庫的觸發器有問題了,所以先定位到這個觸發器 SELECT * FRO

Oracle新增使用者登入提示“ORA-04098觸發器‘GD.ON_LOGON_TRIGGER’無效且未通過重新驗證”

接著上一篇建立一個只有檢視許可權的使用者,在測試環境,新建賬號後嘗試登入,提示如下: 1.看提示是base庫的觸發器有問題了,所以先定位到這個觸發器 SELECT * FROM DBA_OBJECTS WHERE OBJECT_TYPE='TRIGGER'and OBJECT_NAME = '

二十一、Oracle學習筆記編寫函式觸發器

一、函式或過程的選擇     1.如果要進行DML(增刪改),選擇儲存過程     2.如果沒有DML,選擇函式     二、函式 1.格式 create or replace function 函式名(引數1 型別,引數2 型別, 。。。) return

Oracle ORA-12541TNS無監聽程序

dem 適配器 proto .sh min local windows 退出 %s Oracle ORA-12541:TNS:無監聽程序

Oracle學習筆記wm_concat函式合併欄位

  在Oracle中使用wm_concat(column)可以實現欄位的分組合並,逗號分隔。   例如,現有表temp_cwh_test: -- 建立臨時表 create table temp_cwh_test ( u_id varchar(10), goods varchar(32

ORA-04098觸發器無效且未通過重新驗證

用powerdesign設計好表單,其中主鍵設定為每插入一行資料前自增1。把指令碼複製到Oracle Developer中執行,之後在前端執行時報錯 ORA-04098:觸發器無效且未通過重新驗證。 然後開始排錯,確認語法等無誤後,手動將PD裡sequence的指令碼放到developer中執行

Oracle學習筆記trunc函式

  在Oracle中可以使用trunc函式進行日期擷取和數字擷取,具體使用方法如下:   1、trunc(for dates) 日期擷取   語法:trunc(date,[fmt]) select trunc(sysdate) from dual; -- 2018/11/14 返回當前的日期 se

Oracle ORA-08004序列 XXXX NEXTVAL exceeds MAXVALUE 無法例項化

記錄問題 由於last_number 值超過1000了 解決方法: 菜鳥解決方法: 算出當前值,和你要修改的值的差(正負都可以)假設為 100 alter sequence SEQ_name increment by 100 nocache; select SEQ_name.nextva

解決觸發器檢測到活動的獨立的事務處理, 已經回退、表發生了變化, 觸發器/函式不能

   今天在寫一個觸發器的時候遇到一個問題,因為要用到新插入表中的資料進行查詢,所以就遇到了一個問題: 解決辦法是在DECLARE中加上一句話:PRAGMA AUTONOMOUS_TRANSACTION 但是這樣又會遇到一個問題: 解決辦法是在DML語句後面加上COMMI

關於觸發器中表*發生了變化, 觸發器/函式不能

       在使用oracle觸發器的過程中出現了表*發生了變化, 觸發器/函式不能讀它的異常,這裡主要只寫關於造成異常的其中一種--變異表。        以下是一個例項,程式碼如下: creat

Oracle觸發器給表自身的欄位重新賦值出現ORA-04091異常

業務描述如下: 在插入一個表的時候,需要根據一個欄位的值更新另一個欄位的值。當然也可以通過程式就能很簡單得實現,只是這個欄位只是資料交換用,和系統主業務沒關係,不想修改程式,所以才用觸發器的方式實現。

oracle變異表觸發器ORA-04091錯誤原因及解決方案

變異表是指激發觸發器的DML語句所操作的表 當對一個表建立行級觸發器時,有下列兩條限制: 1.不能讀取或修改任何觸發語句的變異表; 2.不能讀取或修改觸發表的一個約束表的PRIMARY   KEY,UNIQUE 或FOREIGN KEY關鍵字的列, 但  可以修改其他列

表xxx發生了變化,觸發器/函式不能

當刪除表中的資料的時候,報錯了,是觸發器/函式不能讀它 我的觸發器是當一個表中的資料改變(增、刪、改)後,操作另一張表中的資料,對另一張表中的資料進行增刪操作。 我修改後的觸發器是這樣的,在declare語句塊裡面加了“pragma autonomous_transacti

oracle中使用impdp數據泵導入數據提示“ORA-31684對象類型已經存在”錯誤的解決

fun 創建用戶 spa ide pos 錯誤 markdown ber dmp 轉載請註明出處:http://blog.csdn.net/dongdong9223/article/details/47448751 本文出自【我是幹勾魚的博客

ORA-28547connection to server failed, probable Oracle Net admin error錯誤,解決方法

pro div oracle 資料 安裝 err ora-28547 解決 方法 當用navicat連接oralce數據庫時報ORA-28547錯誤時,直接懵逼了,上網查了資料說是navicat自帶的oci.dll文件的版本和服務器端的oralce數據庫的版本不一致造成的。

(已解決)c# 客戶端程式訪問oracle報錯ORA-12154: TNS: 無法處理服務名

錯誤:ORA-12154: TNS: 無法處理服務名 這個錯誤大家在百度上一搜一大把,但是我出現這個錯誤的原因跟百度不太一樣,我的客戶端程式在不同的目錄可以正常執行,但在其中1個目錄就是要出錯,因此我想到是目錄路徑中出了問題,既然是路徑那就只能是資料夾名有什麼特殊之處導致不能執行,後來發現不能執

本地連線ORACLE報錯ORA-28009: connection as SYS should be as SYSDBA or SYSOPER

1.用jdbc連線: String uName = "sys as sysdba"; String uPwd = "Oracle123"; String driverName= "oracle.jdbc.driver.OracleDriver"; String dbUrl = "

ORA-28547(Navicat Premium連接oracle報錯)

技術 ntc con nbsp inf net ror avi mage 1、背景 Navicat Premium連接oracle報 ORA-28547:connection to server failed, probable Oracle Net admin errro