Я запрашиваю базу данных Firebird 2.5, используя php (ibase). Простые запросы работают нормально, но когда я пытаюсь использовать следующий процедурный запрос, я получаю сообщение об ошибке «неизвестный токен» в строке 1, столбце 5, т. Е. Когда встречается «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
,
Однако при общении с Firebird через API вы можете отправлять только отдельные полные выписки. Таким образом, нет необходимости в терминаторах операторов, и поэтому у самого 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
,
Других решений пока нет …