1

我正在使用 Delphi 7 和 Firebird 2.0。在我的应用程序中,我使用的是 TIBScript 组件。当我在脚本中使用局部变量时会出现问题。在某些情况下,Firebird 要求局部变量的名称前面有一个冒号。这就是问题所在。应用程序停止显示错误消息:

动态 SQL 错误
SQL 错误代码 = -104
令牌未知 - 第 4 行,第 66 列
?

有问题的标记是冒号。这是我的脚本的样子:

SET TERM ^ ;
    
EXECUTE BLOCK AS
  DECLARE test_variable INT;
BEGIN
  SELECT tt.id FROM test_table tt WHERE tt.name LIKE 'abc%' INTO :test_variable;

  INSERT INTO test_table2(id, test_column)
  VALUES(1, :test_variable);

  INSERT INTO test_table3(id, test_column)
  VALUES(1, :test_variable); 
    
  ...
    
END^
    
SET TERM ; ^

从 IBExpert 运行时,相同的脚本执行时不会出现任何错误。

如何在 TIBScript 中使用局部变量?任何帮助,将不胜感激!

我想补充一点,这个问题只发生在 EXECUTE BLOCK 构造中的变量上。存储过程和触发器定义中的局部变量没有问题。

4

1 回答 1

3

执行该方法后TIBSQL.PreprocessSQL(Unit IBX.IBSQL line 2362),前面标有“:”的参数被替换为“?”。所以你应该使用没有“:”的参数。我也认为它应该被删除SET TERM。相反,要设置终止符值,请使用该IBScript.Terminator 属性。

PS 我在 Delphi 10.3 Rio 中观看了单元 IBX.IBSQL。

这个

EXECUTE BLOCK AS
  DECLARE test_variable INT;
BEGIN
  SELECT tt.id FROM USERS tt WHERE (tt.fname LIKE 'abc%') INTO test_variable;
END;

正确执行时

IBScript.Terminator = ^;

编辑:

使用 TIBScript 组件时不能INSERT使用参数执行。EXECUTE BLOCK

正如 Mark Rotteveel 所说:

不幸的是,删除冒号只是into子句中的一个选项,而不是其他出现的局部变量或参数。

于 2020-06-24T10:06:43.980 回答