首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代RDB$GET_CONTEXT和RDB$SET_CONTEXT

替代RDB$GET_CONTEXT和RDB$SET_CONTEXT
EN

Stack Overflow用户
提问于 2014-11-17 00:07:00
回答 1查看 1.3K关注 0票数 3

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

下面是完整的Firebird SQL:

代码语言:javascript
复制
if (rdb$get_context('USER_TRANSACTION', 'Lock_Trigger') = '1') then exit;
EN

回答 1

Stack Overflow用户

发布于 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,只需插入/更新/选择所需的值:

代码语言:javascript
复制
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可能发生冲突。

*我相信这些功能也提供原子类型的操作,以避免读写冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26963602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档