我的数据库中有一个存储过程,它执行查询并使用结果填充表。
由于查询结果的循环需要花费大量时间,因此我尝试通过post_event
声明发布事件。
Firebird事件的一个(合理的)缺点是它们在事务提交之前不会被执行(see this PDF):
发布事件后,订阅它的每个客户都将收到通知。为了实现这一点,一个名为Event Manager的单独Firebird组件在后台运行,并维护他们注册接收的应用程序和事件列表。只有在运行触发器或存储过程的事务被提交时,才会将事件发送到事件管理器。
但我正在执行一个耗时的存储过程。所以,我需要立即执行事件。
因此,我尝试使用in autonomous transaction do
发布事件。不幸的是,这没有用,因为
自治事务与父事务具有相同的隔离级别。
我的下一个方法是使用execute statement
选项with autonomous transaction
和on external
使更加自主。为此,我写了一个存储过程:
CREATE PROCEDURE EXECUTE_STATEMENT_EXTERNAL (
STATEMENTTEXT TYPE OF DMN_SQLSTATEMENTS)
AS
DECLARE VARIABLE ATTACHMENT_NAME TYPE OF DMN_RDB_ATTACHMENTNAME;
begin
select MON$ATTACHMENT_NAME
from mon$attachments
where MON$ATTACHMENT_ID = CURRENT_CONNECTION
into :attachment_name;
execute statement statementtext
with autonomous transaction
on external '127.0.0.1:' || :attachment_name
as user '<my user name>'
password '<my password>';
end
不幸的是,这也行不通。此外,它会显着减慢调用存储过程。
所以,在我尝试过的所有内容之后,是否有任何东西可以让事件立即执行?