Я пытаюсь написать функцию PostgreSQL, которая вставляет данные в базу данных, а затем получает некоторые данные и возвращает их.Вот код:
CREATE OR REPLACE FUNCTION newTask(projectid api.objects.projectid%TYPE, predecessortaskid api.objects.predecessortaskid%TYPE, creatoruserid api.objects.creatoruserid%TYPE, title api.objects.title%TYPE, description api.objects.description%TYPE, deadline api.objects.deadline%TYPE, creationdate api.objects.creationdate%TYPE, issingletask api.tasks.issingletask%TYPE)
RETURNS SETOF api.v_task AS
$$
DECLARE
v_objectid api.objects.objectid%TYPE;
BEGIN
INSERT INTO api.objects(objectid, projectid, predecessortaskid, creatoruserid, title, description, deadline, creationdate) VALUES (DEFAULT, projectid, predecessortaskid, creatoruserid, title, description, deadline, creationdate)
RETURNING objectid INTO v_objectid;
INSERT INTO api.tasks(objectid, issingletask) VALUES (v_objectid, issingletask);
RETURN QUERY (SELECT * FROM api.v_task WHERE objectid = v_objectid);
END;
$$ LANGUAGE plpgsql;
objects
и tasks
- обе таблицы, а v_task
- это представление, которое является объединением двух.Причина, по которой я возвращаю только что вставленные данные, заключается в том, что над ним работают некоторые триггеры.
Пока все хорошо.Я использую RETURNS SETOF api.v_task
в качестве возвращаемого типа и RETURN QUERY (...)
и поэтому ожидаю, что результат будет выглядеть как SELECT from v_task
(те же столбцы с теми же типами данных).Однако на самом деле происходит следующее (вывод из pgAdmin, тот же результат, что и для моего node.js-application
):
SELECT newTask( CAST(NULL AS integer), CAST(NULL AS integer), 1, varchar 'a',varchar 'a', cast(NOW() as timestamp(0) without time zone), cast(NOW() as timestamp(0) without time zone), true);
newtask
api.v_task
--------
"(27,,,1,a,a,"2012-03-19 12:15:50","2012-03-19 12:15:50","2012-03-19 12:15:49.629997",,t)"
Вместо нескольких столбцов вывод принудительно переводится в один, разделенный запятыми.Я уже использую специальный тип записи. Я не могу использовать ключевое слово AS
для указания полей моего вывода.