替代RDB $ GET_CONTEXT和RDB $ SET_CONTEXT

时间:2014-11-17 00:07:01

标签: sql firebird interbase

我需要将Firebird中的SQL语句RDB$GET_CONTEXTRDB$SET_CONTEXT转换为Interbase,这样我应该使用什么?

以下是完整的Firebird SQL:

if (rdb$get_context('USER_TRANSACTION', 'Lock_Trigger') = '1') then exit;

1 个答案:

答案 0 :(得分:1)

这些功能或多或少*用于访问Firebird的键值系统表的快捷方式。您可以使用全球临时表格来模仿它

  

使用全局临时表允许应用程序通过   中间结果集从应用程序的一个部分到   同一申请的另一部分。

     

创建全球临时表

     

通过全局临时表向数据库模式声明   正常

CREATE TABLE statement with the following syntax:
CREATE GLOBAL TEMPORARY TABLE table (<col_def> [, <col_def> | 
<tconstraint> ...])
[ON COMMIT {PRESERVE | DELETE} ROWS];
     

您提供CREATE GLOBAL TEMPORARY TABLE的第一个参数是   临时表名,这是必需的,并且必须是唯一的   数据库中的所有表和过程名称。你还必须提供   至少有一个列定义。

     

ON COMMIT子句描述   是否删除临时表的行   事务提交(ON COMMIT DELETE)或保留在原位(ON COMMIT   PRESERVE)由同一数据库中的其他事务使用   附件。如果未指定ON COMMIT,则为默认值   行为是在事务提交上删除ROWS。

ON COMMIT DELETE GTT模仿*context('USER_TRANSACTION'...)ON COMMIT PRESERVE模仿*context('USER_SESSION'...)。有关详细信息,请参阅Interbase DataDef手册。

因此,您可以使用字段(KEY,VALUE)创建GTT,只需插入/更新/选择所需的值:

Get:
select Value from MY_GTT where Key = :key

Set:
select count(*) from MY_GTT where Key = :key into :Cnt;
if (:Cnt = 0) then
   insert into MY_GTT(Key, Value) values(:Key, :Value)
else
   update MY_GTT SET Value=:Value where Key = :key

请注意,当从同一附件的多个交易中读取/写入相同的值时,COMMIT PRESERVE ROWS GTT可能会发生冲突。


*我相信这些函数还提供原子类型的操作以避免读写冲突。