firebird - 如何在 Firebird 的客户端 DML 脚本中声明/使用局部变量

标签 firebird

我是 Firebird DML 新手。

在 TransactSQL 中,我可以自由且简单地声明和使用变量,如下所示

declare @myID int

select @myID = 42

并在 SELECT 语句中使用这些变量

select * from mytable where id = @myID

并在不同语句之间传递值。

我的问题很简单,如何在客户端 Firebird DML 脚本中声明和使用局部变量?

使用 FlameRobin,我可以一次性执行一系列 DML 语句,例如

update mytable set price = 2 * price;
select * from mytable;

但我完全不知道如何声明和使用局部变量在它们之间传递值。

谷歌搜索,我发现了 Firebird 的 PSql 的 EXECUTE BLOCK 构造,它显然支持 DECLARE VARIABLE,但它看起来很麻烦,似乎包含一些我在 TransactSQL 中从未遇到过的奇怪限制,而且似乎并不旨在用于我正在尝试执行的客户端 DML 脚本类型。

最佳答案

过去几天我一直在努力解决这个问题,试图完成对这个问题的回答:sql and fifo simple select ;我花了大约半个小时来编写和测试 TransactSQL 方法来执行 OP 的要求。

我本来会选择向您建议的EXECUTE BLOCK路线,但我一直遇到DML事情,这些事情显然是不允许的,所以我放弃了政治正确的做法方式。

因此,我采用了一种可能会让 Firebird 纯粹主义者大吃一惊的方式:与其尝试声明变量,只需创建一个临时表,其中包含与您将使用的变量相对应的列,以及一个 ID 以便于轻松地声明变量。从中提取值,然后将变量的值存储在其中的一行中。像这样的东西:

create table variables(ID int, myID int, myStringVar charchar(80), [etc...])

显然,您可以根据需要初始化此表,并随时更新列值。访问其中的值比访问变量的值要麻烦一些,但也不是太多,如

update mytable set somecolumn = 666 where id = (select myID from variables where ID = 1)

我相信您已经明白了。 我发现以这种方式做事唯一的小烦恼,而且说实话,我不确定它是 Firebird 的东西还是 FlameRobin 的东西是,似乎有必要将数据库对象(如表和 View )的创建包装在一个事务中,该事务可以得到在尝试使用它们的语句 block 之前提交。

关于firebird - 如何在 Firebird 的客户端 DML 脚本中声明/使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41860179/

相关文章:

database - 带有数据库连接的 Delphi 中的 Windows 服务

database - 哪个嵌入式数据库具有最大的 SQL 合规性和并发支持?

linux - Ubuntu Firebird2 经典服务器配置使用所有 CPU

indexing - Firebird 使用什么类型的索引以及为什么?

sql - 左外连接涉及三个表

database - 为什么我的 Firebird 数据库对于它保存的数据量来说如此庞大?

java - 我可以将 JBoss AS 5 或 6 与 Firebird 或 InterBase SQL 服务器一起使用吗?

SQL 查询对不同记录进行计数并打印在 1 行中

global - Firebird 全局临时表(GTT),触摸其他表?

java - 在 Firebird 中一次为 Prepared Statement 批处理生成多个 ID