1. 程式人生 > >關於觸發器中表*發生了變化, 觸發器/函式不能讀它

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

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

       以下是一個例項,程式碼如下:

create or replace trigger TIB_STAGE
  after insert on flow_instance_node  
  for each row
declare
  -- local variables here
    integrity_error  exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;
    v_dbid           char(50);
    v_pre_id         char(50);
    v_node_name      char(50);
begin
   --從v_pre試圖中讀取pre_id
   select p.PRE_ID into v_pre_id from v_pre p  where p.INSTANCE_ID = :new.instance_id;
   select t.node_name into v_node_name from v_flow_instance_node t where t.INSTANCE_ID = :new.instance_id and t.FLOW_NODE_ID = :new.flow_node_id;
   if(v_node_name = '承辦登記') then
       v_node_name := '資料審查';
   end if;
   if(v_node_name = '結束') then
       v_node_name := '辦件歸檔';
   end if;
   v_dbid := SYS_GUID();
   insert into cei_pre_time_use (dbid,pre_id,node_name,start_date,end_date)
                         values (v_dbid,v_pre_id,v_node_name,:new.start_date,:new.end_date);
   P_CHECK_ENT_PRE_STAGE_TYPE(v_dbid,v_node_name,:new.instance_id);
--  Errors handling
exception
    when integrity_error then
       raise_application_error(errno, errmsg);  
end TIB_STAGE;

        在以上SQL中,是要在flow_instance_node表插入資料後,將其中的一些資料插入到cei_pre_time_use表中,但是實際上在有資料插入到flow_instacne_node表中後,就會出現表flow_instance_node發生了變化, 觸發器/函式不能讀它。

    問題分析:

    出現以上異常是因為trigger中SQL語句不能進行讀或者修改觸發語句的任何變異表,包括觸發表本身。變異表就是當前被DML語句修改的表,而對於資料庫上的trigger(觸發器)來說,變異表就是trigger在其上定義的表。   

    解決方案:

    仔細檢查後,發現其中涉及到一個v_flow_instace_node的檢視,該檢視就是通過flow_instance_node表和另一個flow_node表關聯的,而在以上程式碼中通過:new.instance 去關聯v_flow_instacnce_node檢視顯然違反了以上變異表規則。放棄使用該檢視,直接使用flow_node表去返出欄位node_name後,異常消失。


相關推薦

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

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

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

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

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

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

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

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

Cnblogs 的 MetaWeblog 的介面發生變化

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-famil

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

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

C++中解構函式為虛擬函式時呼叫發生什麼變化

昨天去XX公司面試,面試官問了一個關於C++類解構函式為虛擬函式時,如果是父類的指標用子類來new,如果發生析構時,解構函式是virtual與不是virtual有什麼區別。當時答的不好,回來總結了一下,在機器上實現了一遍,終於搞明白了。記錄下來,以後遇到這種情況自己一定不要

刪除掉一個元素後,數組的索引發生變化,造成程序的異常解決方法

ble 變化 cti spl log this 索引 解決 del sureRuleDelete () {   this.deleteRuleDialog = false   for ( let i=this.tableData.length; i>=0; i--

Quick BI升級到3.0以上版本後,究竟發生哪些變化

BI產品的市場競爭激烈,產品的迭代也日新月異,一直定位“人人都是資料分析師”的阿里雲Quick BI近日又有大版本的更新,初看就能發現儀表板的視覺化介面有了很大的變化。新增的很多功能可以看出產品一直致力於降低使用者的門檻,這就幫大家總結一下升級後的變化。 一、儀表板層面:

記憶體分割槽、字串逆置函式發生訪問衝入的原因

題目:將一個字串逆置輸出 我下寫的程式碼如下: void reserve_string(char *string) {        char tmp;//變數tmp用來做交換        char *first_str = string;//字串的首指標   

呼叫malloc()函式之後,核心發生什麼?附malloc()和free()實現的原始碼

         特此宣告:本文參照了另外一篇文章和一個帖子,再結合自己的理解總結了malloc()函式的實現機制。     我們經常會在C程式中呼叫malloc()函式動態分配一塊連續的記憶體空間並使用它們。那麼,這些使用者空間發生的事會引發核心空間什麼樣的反應呢? ma

main 函式發生什麼

程式如何執行?main函式前發生了什麼? 一個iOS程式跑起來需要經過由高階語言轉化為彙編最終轉換成01編碼,經過以下幾步: 預處理 語法和語義分析 生成程式碼和優化 彙編 連結   下面幾篇文章對概念和流程進行了梳理,很詳細,

從校園到阿里,這群年輕的技術人發生哪些變化

有一種快樂,叫成長。 有一種成長,叫成就。 青春本澀,熱望成橙。 從校園到阿里, 同學們都有哪些不一樣的體驗? 他們迫不及待想告訴你, 和你分享點點滴滴。 長別 資料庫事業部 16歲上北大, 25歲夏天,博士畢業的他來到阿里。

程式設計師畢業後的第二年發生哪些變化

點選上方“程式人生”,選擇“置頂公眾號”第一時間關注程式猿(媛)身邊的故事封面源自:Halt a

SQL Server DDL Triggers to Track All Database Changes(用SQLServer DDL 觸發器跟蹤所有資料庫變化)

Problem In a perfect world, only the DBA would have sa privileges, F5 would only ever be hit on purpose, every change would go throug

圖學C語言】編譯時發生什麼?

編譯過程為預處理,編譯(.s檔案),優化,彙編(.o檔案),連結(生成可執行檔案) -c 生成.o檔案,也就是二進位制檔案 -S 生成.s檔案 也就是彙編檔案 一、你知道編譯的時候發生了什麼嗎? 你知道C語言編譯時發生了什麼嗎? 是不是像我一樣嫌棄老師上課講的冗

【數字化】數字化轉型成功的企業都發生什麼變化?

“連線對我們來說並不陌生。我們從1995年開始將產品與網際網路連線起來。但今天的情況是,我們正在將一切聯網的事物連線起來,從發電廠到插頭。一言以蔽之,所有的產品都將被連在一起,一切資料都將匯聚到一起,而我們運用分析學來實現決策自動化或者協助決策。過去,我們經營客戶關係時一般著重於提供急需的專案和服務,但

從建立程序到進入main函式發生什麼?

前幾天,讀者群裡有小夥伴提問:從程序建立後,到底是怎麼進入我寫的main函式的? 今天這篇文章就來聊聊這個話題。 首先先劃定一下這個問題的討論範圍:C/C++語言 這篇文章主要討論的是作業系統層面上對於程序、執行緒的建立初始化等行為,而像Python、Java等基於直譯器、虛擬機器的語言,如何進入到main函

從瀏覽器地址欄輸入網址,到網頁徹底打開,中間都發生什麽?

流氓軟件 打開 軟件 獲取 大量 上一個 負責 一段 動態腳本 從瀏覽器地址欄輸入網址,到網頁徹底打開,中間都發生了什麽? 這是一道經典面試題,以前我以為只有我喜歡出這道題,後來在微博上發現其他技術大牛也出這道題。 這道題其實測試的不是具體特定的技術,而是對整個上網

在瀏覽器中輸入URL按下回車鍵後發生什麽

顯示 瀏覽器中 鏈路 url 傳輸層 查詢 sso mac css 在瀏覽器中輸入URL按下回車鍵後發生了什麽 [1]解析URL[2]DNS查詢,解析域名,將域名解析為IP地址[3]ARP廣播,根據IP地址來解析MAC地址[4]分別從應用層到傳輸層、網絡層和數據鏈路層分別加