firebird过程查询抛出”;令牌未知”;错误在“;设置术语#&”;


firebird procedural query throwing "token unknown" error at "SET TERM #;"

我正在使用php(ibase)查询firebird 2.5数据库。简单的查询运行良好,但当我尝试使用以下过程性查询时,我在第1行第5列遇到了"token unknown"错误,即遇到"TERM"时。我觉得我错过了一些非常基本的东西!

$query = <<<X
SET TERM #;
EXECUTE BLOCK 
   RETURNS (product INT, minPrice FLOAT, maxPrice FLOAT)
AS
DECLARE transID INT = 8733;
BEGIN
  FOR
    SELECT "Product", MIN("CurrencyRate" * "UnitPrice"), MAX("CurrencyRate" * "UnitPrice")
    FROM "CustomerStockInDetail"
    HAVING "Product" = :transID
    INTO :product, :minPrice, :maxPrice
  DO
     SUSPEND;
END#
SET TERM ;#
X;

语句SET TERM不是Firebird本身语法的一部分。它是ISQL语法的一部分,其他Firebird查询工具(例如FlameRobin)也以它为例。

SET TERM在语句结束时指示查询工具(默认情况下,它们使用分号(;))。当查询工具读取语句终止符时,查询工具知道该语句是完整的,并且可以将其发送到服务器。但是,存储过程(和执行块)也使用分号来结束语句。在这种情况下,查询工具需要不同的终止符,因此需要SET TERM

然而,当通过API与Firebird通信时,您只能发送单独的完整语句。因此不需要语句终止符,因此Firebird本身也没有语句终止符的概念,除了在PSQL(过程语言)中。

长话短说,删除SET TERM并将代码更改为:

$query = <<<X
EXECUTE BLOCK 
   RETURNS (product INT, minPrice FLOAT, maxPrice FLOAT)
AS
DECLARE transID INT = 8733;
BEGIN
  FOR
    SELECT "Product", MIN("CurrencyRate" * "UnitPrice"), MAX("CurrencyRate" * "UnitPrice")
    FROM "CustomerStockInDetail"
    HAVING "Product" = :transID
    INTO :product, :minPrice, :maxPrice
  DO
     SUSPEND;
END
X;

还要注意最后一个END之后没有终止符。