2015-09-17 5 views
0

Я только недавно начал заниматься PostgreSQL, и я строил функции для обработки необходимых задач.Возвращение нескольких значений в функции

Существует таблица под названием queue, в которую добавляются новые задачи со статусом «New». Следующая функция должна обновлять эти новые задачи и возвращать их значения столбцов queueid, которые являются сериалами bigint. Поскольку не может быть ни одного, одной или нескольких задач, я должен иметь возможность возвращать ни одного, одно или несколько значений.

Возвращая эти значения, я встал против стены. Я искал ответы на вопросы, но пока не добился успеха. В последнем эксперименте я попытался использовать переменную OUT и присвоить ей результаты, но, по-видимому, INTO не может правильно присвоить значения массиву, и я не понял, как заставить его работать.

Пожалуйста, помогите мне. :) Очень признателен.

CREATE OR REPLACE FUNCTION assign_task(
    IN worker text, 
    OUT id bigint[]) 
RETURNS bigint[] AS 
$BODY$BEGIN 
EXECUTE 'UPDATE queue 
    SET status = ''In progress'', worker = $1 
    WHERE status = ''New'' 
    RETURNING queueid' 
INTO id 
using worker; 
END;$BODY$ 
LANGUAGE plpgsql VOLATILE 
+0

Вы проверили это -> 1. https://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions 2. http://www.postgresql.org/message-id/[email protected] 3. http://stackoverflow.com/questions/4547672/return-multiple-fields-as -a-record-in-postgresql-with-pl-pgsql – Techidiot

+0

Да, я это сделал. 1. Довольно трудно прочитать текст, но тем не менее не удалось найти применимый пример, с которым я мог бы работать. 2. Несмотря на предмет, содержащий несколько значений, это другая проблема. 3. Опять же, другая проблема, несмотря на сходство в предмете. – KeeperB5

ответ

2

Вы по-прежнему усложняете ситуацию. Поскольку вы хотите вернуть несколько значений, вам необходимо определить функцию как returns table или returns setof. Я предпочитаю returns table, потому что он позволяет также определять имена столбцов результата.

Вам также не нужно PL/PgSQL для этого простой SQL функция с UPDATE заявления достаточно:

CREATE OR REPLACE FUNCTION assign_task(IN worker text) 
    returns table (id bigint) 
as 
$BODY$ 
UPDATE queue 
    SET status = 'In progress', worker = $1 
    WHERE status = 'New' 
    RETURNING queueid; 
$BODY$ 
LANGUAGE sql VOLATILE; 
+0

Спасибо, я действительно усложнил ситуацию. :) Я использовал setof, потому что не смог найти способ создать функцию в pgAdmin, которая возвращает таблицу. Но setof отлично подходит для моих целей. Еще раз спасибо. :) – KeeperB5

+0

@ KeeperB5: создание функции, которая возвращает таблицу, не отличается в pgAdmin, чем в любом другом клиенте: просто запустите соответствующий оператор SQL –

Смежные вопросы