Привет еще раз
Теперь, понадобилась такая функция:
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');
Как можно решить мою проблему? не создавая отдельной функции для отдельной таблицы?
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
ответ
к сожалению, там нет ответа на вопрос о неявном задании типа возвращаемых данных)
можно же так
это по поводу возрата record как одной записи...
ну и в зависимости от задачи можно напридумывать всяческих извращений типа динамически создавающихся функций уже с явно указанным типом возврата..