1. 程式人生 > >Oracle中變異表(ORA-04091)處理方法兩則

Oracle中變異表(ORA-04091)處理方法兩則

Oracle中經常使用了trigger經常會出現ora-04091變異表問題,這裡帶來兩種處理方法給大家參考。 --**** example  ***** 場景描述: --1. init table create table sales (prod_code varchar2( 4),amount_sold number ) ; insert into sales values ( '0100',0 ); insert into sales values ( '0200',0 ); insert into sales values ( '0300',0 ); commit ; select * from sales order by 1 ; -- 2. 如果插入或者更新子類別,父類別的總銷量必須級聯更新
-- 比如 如果更新了0111 類別銷量加1 那麼 父類別0100 的銷量必須也加上1 /* Test trigger : create or replace trigger sales_amount_refresh   after insert on sales   for each row   when (new.amount_sold>0) declare begin   update sales      set amount_sold = amount_sold + :new.amount_sold    where substr(:new.prod_code, 0, length(rtrim(prod_code, '0'))) =
         rtrim(prod_code, '0') ; end ; */ --會產生變異表的問題 /* Test sql : SQL> insert into sales values ('0111',1) ; insert into sales values ('0111',1) ORA-04091: table DEXTER.SALES is mutating, trigger/function may not see it ORA-06512: at "DEXTER.SALES_AMOUNT_REFRESH", line 4 ORA-04088: error during execution of trigger 'DEXTER.SALES_AMOUNT_REFRESH'
*/ --解決辦法1:可以使用自制事務來解決,但是有bug,即無法回滾 /* create or replace trigger sales_amount_refresh   after insert on sales   for each row   when (new.amount_sold>0) declare   pragma autonomous_transaction ; begin   update sales      set amount_sold = amount_sold + :new.amount_sold    where substr(:new.prod_code, 0, length(rtrim(prod_code, '0'))) =          rtrim(prod_code, '0') ;   commit ; end ; 自治事務裡面的語句不會回滾 */ --解決辦法2  使用package的集合變數記錄需要變更的資訊,然後使用statement級別的trigger 執行update操作,package中的變數只在session中有效 --只需要建立一個package 頭即可 create or replace package pkg_vars is  type c_t is table of number index by varchar2(4 ) ;   refresh_sales_list c_t ; end ; / --修改行級觸發器為 create or replace trigger sales_amount_refresh  after insert on sales  for each row  when (new.amount_sold> 0) declare begin  if length(rtrim (:new.prod_code, '0'))> 2 then     pkg_vars.refresh_sales_list(:new.prod_code) := :new.amount_sold ;  end if ; end ; / --新增語句級觸發器 create or replace trigger sales_amount_refresh_statement  after insert on sales declare   ind varchar2( 4) ; begin   ind := pkg_vars.refresh_sales_list.first ;  WHILE ind IS NOT NULL LOOP  update sales  set amount_sold = amount_sold + pkg_vars.refresh_sales_list(ind)  where substr(ind, 0 , length( rtrim(prod_code, '0' ))) =  rtrim(prod_code, '0' ) and length(rtrim (prod_code, '0'))= 2 ;     ind := pkg_vars.refresh_sales_list.NEXT(ind);  END LOOP;   pkg_vars.refresh_sales_list.delete ; end ; / 如需轉載,請註明出處: http://blog.csdn.net/renfengjun/article/details/18601155

相關推薦

Oracle變異ORA-04091)處理方法

Oracle中經常使用了trigger經常會出現ora-04091變異表問題,這裡帶來兩種處理方法給大家參考。 --**** example  ***** 場景描述: --1. init t

oracle變異觸發器的處理

可以使用AutoCommit方法解決。例如: CREATE OR REPLACE TRIGGER TRIGGER_NAME [BEFORE|AFTER] ACTION ON TABLE_NAME FOR EACH RO

矩陣式比較文字字串相似度包含漢字)方法java程式碼)

package com.gsww.ctyxy.util; import java.text.NumberFormat;   import java.util.Locale;    /**  * 比較兩個字串的相似度  */   public class AutomaticRating {   /*    pu

oracle建立作業空間)

        需求:每月1日執行,從TableSpace為SDE的幾張表中讀取每個工程的設施數量,儲存於TableSpace為SCOTT的T_DIC_MTTYP中         環境:PLSQL         步驟: 1. 建立儲存過程(在TableSpace為SC

Oracle ORA-39726壓縮刪除欄位處理方法

今天在往一個壓縮表增加一個欄位可以增加成功,但在刪除的時候報了個 ORA-39726 unsupported add/drop column operation on compressed tables的錯誤。 錯誤是不能對壓縮表增加或刪除欄位,奇怪的可以增加,但是不能刪

Oracle暫時空間的清理

問題 清理 空間名 tex tab fcm including 原因 正在 作者:iamlaosong Oracle暫時表空間主要用來做查詢和存放一些緩沖區數據。暫時表空間消耗的主要原因是須要對查詢的中間結果進行排序。暫時表空間的主要作用: 索引create

Oracledual的用途介紹

fun other process product 不可見 hat rtu database urn dual是一個虛擬表,用來構成select的語法規則,oracle保證dual裏面永遠只有一條記錄。我們可以用它來做很多事情,如下:   1、查看當前用戶,可以在 SQL

Oracle觸發器-變異觸發器不能訪問本

col 讀取 key commit 觸發器 圖片 gre mar nbsp 1 CREATE OR REPLACE TRIGGER trgregisterpregroup 2 AFTER UPDATE 3 ON tblregisterusers 4 FOR E

Postgresql臨時temporary table)的特性和用法

.net 他會 acl tmp 就會 fonts 功能 不能 聲明 熟悉Oracle的人,相比對臨時表(temporary table)並不陌生,很多場景對解決問題起到不錯的作用,開源庫Postgresql中,也有臨時表的概念,雖然和Oracle中臨時表名字相同,使用方法和

oracle 關於“ORA-30036”處理方法

選項 新建 兩個 success 開始 解決辦法 exp part spa ORA-30036:unable to extend segment by 8 in undo tablespace ‘UNDOTBS1‘出現問題原因:大批量導入某表時imp報錯如下:Export

oracle操作及欄位註釋

1、查詢表註釋 SELECT * FROM USER_TAB_COMMENTS;三列:TABLE_NAME,TABLE_TYPE,COMMENTS 2、查詢欄位註釋 SELECT * FROM USER_COL_COMMENTS;三列:TABLE_NAME,COLUMN_NAME,COM

Oracle split分割槽引起ORA-01502錯誤

繼上次刪除分割槽表的分割槽遇到ORA-01502錯誤後[詳細見連結:Oracle分割槽表刪除分割槽引發錯誤ORA-01502: 索引或這類索引的分割槽處於不可用狀態],最近在split分割槽的時候又遇到了這個問題。這裡記錄一下該問題是如何產生的,以及如何去解決。 (一)目的     &

Oracle發生加鎖、死鎖的原因,檢視,與解決方法

一.表加鎖、死鎖出現的現象 1.對資料庫操作update,insert,delete時候,資料庫無法更新,操作等待時長,操作結果不發生改變 2.在程式中,底層(資料訪問層)操作時候,不成功,資料庫連線超時,無法操作,或者操作等待時長等現象 【加鎖的原理】:比如一個操作在進行修改一表,它

Oracledual

一開始偶遇這張表,還以為是我們領導建的呢!因為我的領導簡稱叫做duanll,哈哈。大概是因為和資料庫有緣吧,所以他才在公司做資料庫的專家。 dual是一個虛擬表,用來構成select的語法規則,oracle保證dual裡面永遠只有一條記錄。我們可以用它來做很多事情,如下: 1、檢視當前使用者

ORACLE建立、對錶進行增刪改查的語法

最近在學習ORACLE,現將在ORACLE中建立表、對錶進行增刪該查的語法總結如下: 表是一種資料庫物件,是基本的資料儲存單位,由行和列組成 表的建立(以課程資訊表為例): CREATE TABLE OBJECTS       

oracle臨時的用法詳解

1、前言 目前所有使用Oracle作為資料庫支撐平臺的應用,大部分資料量比較龐大的系統,即表的資料量一般情況下都是在百萬級以上的資料量。 當然在Oracle中建立分割槽是一種不錯的選擇,但是當你發現你的應用有多張表關聯的時候,並且這些表大部分都是比較龐大,而你關聯的時候發現其中的某一張或者某

MySql資料庫查詢修改字元編碼charset)的方法

MySQL字符集多種多樣,下面為您列舉了其中三種最常見的MySQL字符集檢視方法,該方法供您參考,希望對您學習MySQL資料庫能有所啟迪。 一、檢視MySQL資料庫伺服器和資料庫MySQL字符集。 mysql> show variables like '%char%

使用Setup Factory 打包軟體,安裝時自動建立資料庫及資料庫效果類似sql server的附加資料庫操作)

前提:已安裝Setup Fatory軟體、我使用的是 安裝工廠永樂漢化版,需要的請自行下載安裝 下面只列出關鍵性步驟,黃色字型較為關鍵,是一個出錯點   步驟一(關鍵):生成資料庫備份檔案,以及建表sql指令碼,和bat命令檔案 備份資料庫,生成檔案1,.bak檔

ORACLE關於的一些特殊查詢語句

2018-11-22 10:57 by 瀟湘隱者, ... 閱讀, ... 評論, 收藏, 編輯 1: 如何判斷欄位的值裡面:那些資料包含小寫字母或大小字母 判斷欄位NAME的值裡面有小寫字母的記錄 方式1: SELECT NAME

oracle大資料千萬級)修改,刪除優化技巧【轉】

oracle大資料表(千萬級)修改,刪除優化技巧 執行下面的SQL delete  from idwsq11.SH30_PRCSS_EXCTN_LOG e where deriv_prcss_time_stamp < to_date('2010-JAN-01', 'YYYY-MON-DD'); 省略其他