我需要将SQL语句RDB$GET_CONTEXT和RDB$SET_CONTEXT从Firebird转换为Interbase,那么我应该使用什么?
下面是完整的Firebird SQL:
if (rdb$get_context('USER_TRANSACTION', 'Lock_Trigger') = '1') then exit;发布于 2015-02-12 07:50:08
这些函数或多或少是访问Firebird的键值系统表的快捷方式。您可以使用全局临时表来模拟它
使用全局临时表允许应用程序将中间结果集从应用程序的一个区段传递到同一应用程序的另一个部分。 创建全局临时表 全局临时表通过普通方法声明为数据库架构。 使用以下语法创建TABLE语句:创建全局临时表(, \.)在提交{保存\删除}行时; 您提供的创建全局临时表的第一个参数是临时表名,它是必需的,在数据库中的所有表和过程名称中必须是唯一的。还必须至少提供一个列定义。 ON COMMIT子句描述是否在每个事务提交上删除临时表的行(在提交删除时),还是保留在同一数据库附件中的其他事务使用的位置(提交保存)。如果未指定ON提交,则默认行为是删除事务提交上的行。
ON COMMIT DELETE GTT模仿*context('USER_TRANSACTION'...),ON COMMIT PRESERVE模仿*context('USER_SESSION'...)。有关详细信息,请参阅基础间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可能发生冲突。
*我相信这些功能也提供原子类型的操作,以避免读写冲突。
https://stackoverflow.com/questions/26963602
复制相似问题