我正在使用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
之后没有终止符。