2011-04-03 47 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