2010-12-10 92 views
0

我們最近將從Oracle帳戶開發的一個數據庫更改爲LDAP登錄帳戶,並且對於訪問系統的員工使用的前端進行了很好的改進。但是,我們有第二種限制管理人員進入數據庫的方法,並且使用dbms_scheduler調用大量處理。Oracle全球臨時表和使用存儲過程和功能

大多數數據庫表都有一個created_by列,默認從sys_context獲取其用戶名,但是當數據從dbms_scheduler運行時,此信息不可用,因此created_by列全部使用APP_GLOBAL填充。

我設法用sys_context值填充全局臨時表(GTT),並使用它從dbms_scheduler調用的存儲過程填充created_by,所以我的下一個邏輯步驟是將它放入函數中並調用它它可以在整個系統中使用,甚至可以在插入前觸發引用。

問題是,將代碼放入函數中時未找到來自GTT的數據。該表被設置爲保留行。

我已經拖網許多網站的答案,但沒有發現任何幫助我任何人都可以在這裏提供解決方案?

回答

0

調度程序將使用與創建作業的會話不同的會話 - preserve rows不會使GTT數據在不同會話中可見。

我假設created_by列有一個默認值,如nvl(sys_context(...),'APP_GLOBAL')。考慮將用戶名作爲參數傳遞給作業,並將上下文設置爲作業的第一步。

+0

傑克,我已經成功地填充了與dbms_scheduler相同的會話的GTT,並且可以從中進行選擇。我將代碼放入函數中,以便可以從調度程序運行的所有存儲過程引用它,但是在引用該函數時,不會返回來自GTT的數據。你對created_by的假設幾乎是正確的,表達式是列的默認值,不在觸發器中。 – Colin 2010-12-10 09:58:50

+0

@Colin對不起 - 對觸發器的引用是一個錯字 – 2010-12-10 10:11:06

+0

@Colin調度程序將爲它運行的每個作業使用不同的會話 – 2010-12-10 10:12:01

0

週末休息一下,仔細查看我的代碼,發現我的語法中存在一個致命的缺陷,即從GTT中選擇數據永遠不會發生。一個快速的調整和重新編譯,一切都很好。

傑克,謝謝你的幫助。