2016-11-22 22 views
1

背景:Oracle數據庫(PLSQL)過程內部程序

現在我有這個過程,我們稱之爲主要
主要內容我只是檢查一些數據的完整性。
如果一切順利我所說的第二個程序(內部主),我稱之爲進口。從臨時表
導入將數據插入歷史表(沒有提交它)。
裏面進口我抓住任何異常。
最後,進口一個布爾返回如果成功與否,和處理返回主要
主要檢查進口是否正確,如果是,則調用第三個程序,統計

現在的問題:

是有可能,統計並不認爲改變由進口做?
我的意思是,統計知道關於新數據進口導入到歷史表?

「僞代碼」:

主過程

select count(*) into var1 
from table1; 

if var1 == 0 then 
    storeprocedure_import(result); 

    if (result) = true then 
      storeprocedure_stats(result); 
    end if; 
end if; 

導入過程

insert /*+ append */ into table_history 
     select * 
     from table_temporany; 

STAT程序

for tmp_data in (select distinct(data) dta 
        from table_history 
        order by dta) 
    loop 



     delete from stats_table 
     where data = tmp_data.dta; 

     insert into stats_table 
     select tmp_data.dta, count(*) unique_stb 
     from table_history 
     where tmp_data.dta = table_history.data 
     group by table_history.data; 

    end loop; 

現在我對這個

insert into stats_table 
     select tmp_data.dta, count(*) unique_stb 
     from table_history 
     where tmp_data.dta = table_history.data 
     group by table_history.data; 

有些懷疑因爲我不知道,在點統計被調用時,它知道關於內部table_history新的日期由進口

進口
+0

你能發表一個代碼或一些僞代碼嗎?這會更容易理解你的問題。 – Kacper

+0

@Kacper不僅僅是代碼或僞代碼,我會試着更好地描述我的程序 –

+0

統計數據收集在桌面上..如果你的表格受到影響,統計數據將受到影響。 – XING

回答

1

由於Boneist提到的,在同一個事務中運行(除非你用pragma automomous_transaction另行指定,但我們不要去那裏)的所有程序。

我懷疑由於導入過程中存在insert /*+ append */問題,因爲在對錶執行任何操作(包括查詢)之前,必須提交直接路徑操作,這是您的統計過程試圖執行的操作。這可能是失敗的,異常被您的自定義錯誤處理程序隱藏。

create table demo (c int); 

insert /*+ append */ into demo select 1 from dual; 

1 row created. 

select count(*) from demo; 

ERROR at line 1: 
ORA-12838: cannot read/modify an object after modifying it in parallel 

正如TBONE提到,insert /*+ append */纔有用的數百萬行的批量加載幾十時。