我是 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/