2017-02-14 4 views
4

было интересно, если это возможно, чтобы вернуть более одной строки, найденный в SELECT запрос в Firebird 1.5, как показано ниже:Возможно ли вернуть несколько строк в хранимую процедуру Firebird?

| FIELD1 | FIELD 2 | 
-------------------- 
| 1.00 | 1  | 
| 2.00 | 2  | 
| 3.00 | 3  | 

SET TERM /; 

CREATE OR ALTER PROCEDURE TEST 
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER) 
AS 
BEGIN 
    SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2; 
END/ 

EXECUTE PROCEDURE TEST/ 

SET TERM ;/ 

Предполагая, что запрос возвращает более одного результата/строки, следующая ошибка возникает:

себе не удалось, SQLCODE = -811

Несколько строк в одноэлементных выберите

Очевидно, что механизм Firebird не позволяет мне возвращать более одного значения в переменной. Я разрабатываю программное обеспечение Python, где я хочу получить, например, кортеж, что-то вроде этого [(1.00, 1), (2.00, 2), (3.00, 3)] на основе процедуры TEST. Я использую модуль kinterbasdb для подключения к GDB.

Есть ли способ сделать это?

+0

Пожалуйста, проверьте http://stackoverflow.com/questions/34900648/how-to-execute-procedure-returning-resultset-in-firebird – Tajinder

+0

Из любопытства : почему вы все еще используете kinterbasdb? Он был заменен такими драйверами, как [FDB] (https://pypi.python.org/pypi/fdb/) и [firebirdsql] (https://pypi.python.org/pypi/firebirdsql). –

ответ

3

Что вам нужно, так называется «Выбор хранимой процедуры». В принципе, вы должны изменить свой код, чтобы что-то вроде этого:

CREATE OR ALTER PROCEDURE TEST 
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER) 
AS 
BEGIN 
    for SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2 
    do SUSPEND; 
END 

и вызвать процедуру с SELECT, как это:

SELECT * FROM TEST; 

Удачи!

+0

См. Также https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-storedprocs.html#fblangref25-psql-storedprocs-types –

4

Firebird имеет два types of stored procedures:

  • Исполняемые процедуры получения более одной строки, и выполняются с помощью:

    execute procedure <procedurename> 
    
  • Выбираемых процедур могут производить несколько строк и выполняются с помощью:

    select * from <procedurename> 
    

    Или с параметрами:

    select * from <procedurename>(param, ...) 
    

селектируемые процедуры содержит ключевое слово SUSPEND, который выводит строку и ожидает следующую выборки. Наличие этого ключевого слова - единственное, что отличает два типа.

Предупреждение: можно использовать execute procedure с возможностью выбора, но в этом случае он будет производить только одну строку, и выполнение будет завершено после того, как будет создана первая строка: остальная часть хранимой процедуры после SUSPEND будет не исполняться! Также было возможно «выбрать» из исполняемой хранимой процедуры, но в Firebird 3, которая больше не возможна.

Конкретная причина ошибки «Несколько строк в одноэлементных выберите» является строка:

SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2; 

Это select ... into ... заявление разрешено только для получения одной строки (иначе одноэлементно выбрать).Если вы ожидаете более одной строки, вам нужно использовать for select ... into ... do, что позволяет выполнять итерацию по результирующим строкам.

В сочетании с suspend результате будет:

CREATE OR ALTER PROCEDURE TEST 
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER) 
AS 
BEGIN 
    FOR SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2 
    DO 
    BEGIN 
     SUSPEND; 
    END 
END 

BEGIN ... END -блока технически не нужен, но я предпочитаю всегда использовать блок здесь.

Вы можете выполнить это с помощью:

select variable1, variable2 from test; 
Смежные вопросы