我需要将Firebird中的SQL语句RDB$GET_CONTEXT
和RDB$SET_CONTEXT
转换为Interbase,这样我应该使用什么?
以下是完整的Firebird SQL:
if (rdb$get_context('USER_TRANSACTION', 'Lock_Trigger') = '1') then exit;
答案 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可能会发生冲突。
*我相信这些函数还提供原子类型的操作以避免读写冲突。