2014-11-06 127 views
0

我使用php(ibase)来查询firebird 2.5数据库。简单查询工作正常,但是当我尝试使用以下过程查询时,第1行第5列出现“标记未知”错误 - 即遇到“TERM”时。我觉得我错过了一些非常基本的东西!firebird程序查询在“SET TERM#;”处抛出“token unknown”错误

$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; 

回答

2

声明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后。

+0

谢谢@MMarkRotteveel - 来自你的另一个很好的答案。 EXECUTE BLOCK方法非常适合将PSQL放入DSQL中,但无法解决如何通过API工作! – Dzseti 2014-11-07 16:41:26