2012-10-18 51 views
2

是否有一個高級的oracle功能在提交給oracle之前修改SQL查詢?或者可能會修改結果集?基於一定的條件?像可能基於提交查詢的流程的名稱?還是根據查詢文本?在提交之前更改Oracle SQL查詢文本

這種情況是一個進程(用C++編寫)正在運行一個查詢,我們沒有辦法改變C++代碼。該過程中的特定業務驗證失敗,並且爲了使驗證不失敗,我想要一種方法來處理返回的數據集或在將它提交給Oracle引擎之前操作select查詢。 WHERE ENT_NBR = ''

我想改變它,使得ORACLE總是看到

的C++代碼運行這個確切的查詢

SELECT PL_ID FROM A_HDR並執行以下查詢,而不是

SELECT NULL FROM A_HDR WHERE ENT_NBR = ''

請指導

+1

您需要更具體地解決您正在嘗試解決的問題。你究竟想要改變什麼,以及如何改變? –

+0

問題在於業務流程未能通過驗證。該過程是用C++編寫的,而且我們沒有辦法在供應商消失時更改C++代碼。現在爲了使驗證不失敗,我想要一種方法來處理返回的數據集或在提交給oracle引擎之前操作select查詢。我知道這是一個遠射,但試圖找到一條出路。 – Guddu

+0

仍然太模糊。當我說「更具體」時,我的意思是實際的代碼樣本,例如類似於「C++代碼試圖運行這個查詢'SELECT a FROM b WHERE c',我想將其更改爲'...?...' –

回答

2

Oracle Virtual Private Database可能是你looki什麼ng for。從手冊:

Oracle虛擬專用數據庫(VPD)使您能夠創建安全 策略來控制的行和列級數據庫的訪問。 實質上,Oracle虛擬專用數據庫將動態WHERE 子句添加到針對應用了Oracle虛擬專用數據庫安全策略 的表,視圖或 同義詞的SQL語句。

您或許可以從SYS_CONTEXT獲取過程和查詢文本。例如,sys_context('userenv', 'current_sql')sys_context('userenv', 'module')。您可能還需要使用GV$SESSION以獲取更多信息。

不過,我認爲你應該儘量避免VPD,如果可能的話。它是極端令人困惑的是讓所有的SQL語句在後臺默默轉換。它可以使開發和故障排除非常困難。


更新

在甲骨文12C的SQL Translation Framework功能很可能是這個問題的最佳解決方案。

+0

謝謝瓊斯... SYS_CONTEXT是一個新的信息,並會幫助我在應用程序中前進。 – Guddu

+0

我被禁止在StackOverflow上提出更多問題,只是因爲我收到了這個問題的所有消極因素。我真誠地認爲,當我問到或打算以最好的方式提出問題時,這對我來說有點苛刻。我已經提供了所有邏輯細節,因此我請求你們幫助我解除禁令。 – Guddu

+0

@Guddu我很驚訝你被禁止。你的一些問題有一些問題,但這並不罕見。對不起,說我可能是問題的一部分,我對您的一個問題進行了低估,但您稍後更新了問題並解決了問題。我前幾天撤回了反對票,希望這會取消你的禁令?如果沒有,我想你應該看Meta的建議。我也投票重新開放,但我從來沒有見過重新開放的問題。 –

相關問題