oracle裡面使用臨時表解決表衝突一例(轉貼)

2021-03-31 08:56:29 字數 1265 閱讀 5406

平台:windows 2000 server sp3

資料庫:oracle 9.0.1.1.1

現場描述:使用者抱怨不能同時對多個單位進行資料處理,執行出現的錯誤資訊為:

sql> exec sp_hyb_da_ryxx_dwbh_test('331028')

begin sp_hyb_da_ryxx_dwbh_test('331028'); end;

*error 位於第 1 行:

ora-02055: 分布式更新操作失效;要求回退

ora-06502: pl/sql: 數字或值錯誤 :字串緩衝區太小

ora-06512: 在"sidb.sp_hyb_da_ryxx_dwbh_test", line 55

ora-06502: pl/sql: 數字或值錯誤 :字串緩衝區太小

ora-06512: 在"sidb.sp_hyb_da_ryxx", line 145

ora-06502: pl/sql: 數字或值錯誤 :字串緩衝區太小

ora-06512: 在"sidb.sp_hyb_da_ryxx_yz1", line 25

ora-20901: 過程sp_hyb_daxx出錯;grbh = 1000607288 ora-02049: 超時:

分布式事務處理等待鎖定

ora-06512: 在line 1

經檢查後發現是後台儲存過程中使用了『臨時』表,這些臨時表用於臨時儲存部分正式表的資料,應用程式儲存過程的**形如

delete ;

insert into select *from where …;

這種方法造成了在同時執行的時候由於對鎖定的等待而只能同時進行乙個單位的資料處理。

可以通過使用oracle真正意義上的臨時表消除對臨時表的鎖定。

臨時表的基本定義是:

資料庫中的所有會話均可以訪問臨時表,但只有插入資料到臨時表中的會話才能看到本身插入的資料。可以把臨時表指定為事務相關(預設)或者是會話相關:

on ***mit delete rows:指定臨時表是事務相關的,oracle在每次提交後截斷表。

on ***mit preserve rows:指定臨時表是會話相關的,oracle在會話中止後截斷表。

通過使用oracle的臨時表後可以並行的對資料進行處理,有效的提高了資料處理的速度。

附:建立臨時表的例子

create global temporary table

asselect *from where 1 = 2;

create index on ();

Oracle 鎖表解決

有時候有測試介面,或者查詢sql語句,資料會無限阻塞,而且後台也不報錯。有可能是表被鎖住得原因 用以下sql 檢視鎖表記錄 select t2.username,t2.sid,t2.serial t2.logon time from v locked object t1,v session t2 w...

ORACLE鎖表解決

查詢發生阻塞的sql 從上述執行結果可以看出,發生了行鎖,會話143阻塞了會話138!查詢鎖住的物件 導致143會話,持有tab test表的行鎖沒有釋放鎖的sql select l.session id sid,s.serial l.locked mode,l.oracle username,s....

mysql 臨時變數 Oracle使用臨時變數

在oracle資料庫中,可以使用變數來編寫通用的sql語句,在執行sql語句時,為變數輸入值,就會在sql語句中將變數替換成這些值。在oracle資料庫中,可以使用變數來編寫通用的sql語句,在執行sql語句時,為變數輸入值,就會在sql語句中將變數替換成這些值。臨時變數只在使用它的sql語句中有效...