процедурный запрос firebird, выдающий «неизвестный токен» ошибка в & quot; SET TERM #; & quot;

Я запрашиваю базу данных 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;

0

Решение

Заявление 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,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]