2011-04-03 81 views
1

如何創建PL/SQL函數,該函數在指定的超時時間內等待某行的更新,然後返回。PL/SQL在Oracle中等待更新

我想完成的是 - 我有很長時間的運行過程,它將通過process_id將其狀態更新爲ASYNC_PROCESS表。我需要函數,當這個過程完成時返回true/false,而且我需要這個函數等待這個過程完成,等待一段時間,超時返回或者在過程完成時立即返回true。我不想使用睡眠(1秒),因爲在這種情況下,我會滯後1秒。我不想使用睡眠(1毫秒),因爲在這種情況下,我花了CPU資源(和1毫秒滯後)。

有經驗的程序員如何完成這個好方法嗎?

該函數將.NET(所以我需要DB操作和.NET/UI之間最小的滯後)

日Thnx, 牛肉

+0

我沒有提到什麼,我會打電話給PL/SQL .NET的函數! ;) – 2011-04-03 13:18:12

+0

然後編輯你的問題,使之清楚(包括標籤) – Mat 2011-04-03 13:25:31

回答

3

我認爲最明智的事情在這種情況下做的叫是在ASYNC_PROCESS表上使用更新triggers

您還應該查看DBMS_ALERT包。下面是該文檔的編輯摘錄:

創建警報:

DBMS_ALERT.REGISTER('emp_table_alert'); 

創建你的桌子上一個觸發條件警報:

CREATE TRIGGER emptrig AFTER INSERT ON emp 
BEGIN 
    DBMS_ALERT.SIGNAL('emp_table_alert', 'message_text'); 
END; 

從你.net代碼,你可以使用這就是所謂的:

DBMS_ALERT.WAITONE('emp_table_alert', :message, :status, :timeout); 

請確保您閱讀了文檔t :status:timeout

+0

DBMS_ALERT岩石! – 2011-04-03 13:54:16

1

你應該看看Oracle Advanced Queuing。它提供了您尋找的功能。

您可能需要一個單獨的隊列表,其中ASYNC_PROCESS上的觸發器插入消息。然後使用AQ函數檢索(或等待)隊列表中的下一條消息。

0

如果你在C#.NET中這樣做,你爲什麼不簡單地產生一個工作線程來執行更新(通過ODAC)?當(看起來)你想要一個.NET進程進行更新調用(在後臺)時,爲什麼把責任交給甲骨文,並且主進程被告知完成。

herehere的例子,雖然在.NET幾種方法爲這個(代表,事件,異步回調,線程池等)

+0

工作線程保持打開的數據庫連接。它可以阻止某些資源。應用程序無法關閉,無需中斷DB調用。 – 2011-04-04 17:21:06

+0

@BEEF:您希望在等待更新時關閉應用程序?所以你想要你的應用程序只是開火,忘記更新,然後ping一些表,看看它是否完成? – tbone 2011-04-04 17:29:25