Php firebird程序查询抛出“;“未知标记”;错误在";设置术语#&引用;

Php firebird程序查询抛出“;“未知标记”;错误在";设置术语#&引用;,php,firebird2.5,Php,Firebird2.5,我正在使用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

我正在使用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;

$query=语句
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;

$query=谢谢@mmarkrotterveel-您的另一个极好的回答。执行块方法非常适合将PSQL放入DSQL,但无法解决如何通过API使其工作!