Проблема с функцией

Привет еще раз :)
Теперь, понадобилась такая функция:

CREATE OR REPLACE FUNCTION sel(tbl varchar, name varchar)
  RETURNS record AS
$BODY$
DECLARE sql varchar;
DECLARE DATA record;
BEGIN
	sql := 'SELECT * FROM ' || $1 || ' WHERE name=''' || $2 || ''' ORDER BY id ASC LIMIT 1';
	--RAISE EXCEPTION '%',sql;
	EXECUTE sql INTO DATA  ;
	RETURN DATA;
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;

Запрос:

SELECT sel('logins','svs');

Работает. А :

SELECT * FROM sel('logins','svs');

, для выбора нескольких полей, а не одного, не работает. Выводит сообщение '...column definition list mus be specifyed'

Как можно решить мою проблему? не создавая отдельной функции для отдельной таблицы?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

SELECT *

SELECT * предназначен для получения информаций из таблиц и VIEW. А у вас функция.
Собственно не понимаю в чём должна быть разница в данном случае между запросами - и в том и в другом случае должна вернуться вся запись которую возвращает функция. А вы что хотите чтобы возвращалось?

ответ

я в предыдущих постах описывал, в чем разница между вызовом процедуры

select sel('logins','svs');

и

select * from sel('logins','svs');

В первом случае ответ я получаю типом record. Т.е. одно поле, в котором перечислены через запятую - значения поле.
А во втором, я получаю ответ в виде нескольких полей, как при обычном селекте.

Хочу подчеркнуть, что мы говорим о функциях , возвращающих SETOF таблицы.

В случае, описанном мной выше, у меня нет возможности указать SETOF таблицы, потому, что я имя таблицы передаю в функцию.

Тип record выбирается запросом: select sel('logins','svs');
А ответ типа TABLE не возвращается при: select * from sel('logins','svs');

:( Причем, все работает, если указать явно SETOF таблица ... вот, а я ищу решение, что бы можно было таблицу передать в функцию.

По поводу View. Во View нельзя передать переменные.

У меня тогда

У меня тогда вопрос: каким образом можно выполнить компиляцию вашего SQL запроса с *, если список возвращаемых колонок у функции sel до момента выполнения самой функции неизвестен? Видимо именно с этим и связано получаемое вами сообщение: '...column definition list mus be specifyed'

Ответ

Дэк именно в этом и проблема! Никак!

Я поэтому и обратился сюда, с просьбой помочь реализовать нужный мне функционал. Я не знаю, как это сделать.

Если SETOF задан явно, то вернуть можно и селектом и селектом * from

А вот как бы сделать так, что бы я передавал функции таблицу, а она возращала ответ полями этой таблицы...

Как-то внутри функции может можно что-то переопределить? Возвращаемый тип?

Уважаемый admin в

Уважаемый admin в другой ветке привел ссылку с инфой на обсуждаемую тему, возможно, сгодиться
http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions

ответ

к сожалению, там нет ответа на вопрос о неявном задании типа возвращаемых данных)

можно же так

CREATE OR REPLACE FUNCTION "prod"."test_func" (tabl text) RETURNS SETOF record AS $body$
DECLARE	
rec record;
BEGIN
FOR rec IN execute 'select * from '||tabl loop
RETURN next rec;
end loop;
end;
$body$ LANGUAGE 'plpgsql'
--
SELECT * FROM prod.test_func('foo') AS f(c1 int,c2 int,c3 varchar)

это по поводу возрата record как одной записи...

ну и в зависимости от задачи можно напридумывать всяческих извращений типа динамически создавающихся функций уже с явно указанным типом возврата..

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023