Ответ rstrelba показывает, как решить проблему. Если вы хотите понять это, вот что происходит.
suspend
внутри хранимой процедуры Firebird возвращает строку вызывающей стороне. Он может использоваться по-разному и может рассматриваться как аналог оператора yield
в Python: приостановить операцию и отправить обратно одно значение (или строку, в данном случае), а затем продолжить, когда вызывающая сторона запросит дополнительные данные. (Это должно быть сделано по техническим причинам, потому что драйверы баз данных не всегда извлекают весь набор результатов сразу.)
У вас есть запрос select
, который может вернуть произвольное количество значений, за которым следует один suspend
. Firebird выдает ошибку, говоря вам, что это, вероятно, неправильно. То, что вы хотите сделать, это поместить select в цикл for, который зацикливает набор результатов и приостанавливает один раз для каждой строки, как демонстрирует ответ rstrelba. Это гарантирует, что вызывающая сторона получит все результаты обратно.