как вернуть результат select * из процедуры

Драга
Дата: 13.04.2004 17:30:38
как вернуть результат работы
select * from table
из процедуры,

чтобы было что-то вроде этого

declare
_table alias for $1;
begin
return (select * from _table);
end;

вообще это возможно?
если есть ссылки, где про это можно почитать буду рад.
CM Hungry
Дата: 13.04.2004 19:10:23
http://archives.postgresql.org/pgsql-novice/2003-10/msg00206.php
Драга
Дата: 14.04.2004 15:51:31
Спасибо. с этим разобрались.
Тогда еще вопрос:

Как организовать следующее:

пользователь подключается к бд, пишет запрос
select * from table

а бд в зависимости от каких-то своих метаданных выполняет следующие запросы:

select f1,f2 from table where condition=1
для пользоателя_1

и

select f1,f2,f3,f4,f5 from table
для пользователя_2.

и т.д.

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

Что не получается:
запрос динамически сформировать не проблема, выполнить тоже, но вот с выборкой результата возникает вопрос, как?
CM Hungry
Дата: 14.04.2004 21:24:23
Скорее всего никак.
Т.е. вот однозначно правильного ответа на этот вопрос я нигде не видел.
CM Hungry
Дата: 14.04.2004 21:26:51
Скажем так - в постгресе это, по-моему, не сделать. В оракле можно, но не select * from table, а
select * from func()
Драга
Дата: 15.04.2004 08:51:36
так в postgresql тоже можно сделать
select * from func()

только вот один ньюанс:

CREATE OR REPLACE FUNCTION public.func()
RETURNS SETOF record AS
'declare
_query varchar;
_record record;
begin
_query=\'SELECT * FROM ....\';

for _record IN
EXECUTE _query
loop
return NEXT _record;
end loop;
return ;
end;'
LANGUAGE 'plpgsql' VOLATILE;

если создать такую функцию, то вызов должен быть
select * from func() AS (f1 int8, f2 varchar, ...)

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

если вместо типа RECORD использовать %ROWTYPE, то получается еще забавнее, типы уже указывать не надо, но вот при попытке указать явные поля в select вместо *, будет ругаться.
пример:

CREATE TABLE public.test_table
(
f1 int8 NOT NULL DEFAULT 0,
f2 int8 NOT NULL DEFAULT 0,
f3 int8 NOT NULL DEFAULT 0,
f4 varchar
) WITH OIDS;

insert into test_table(1,2,3,'a');
insert into test_table(4,5,6,'b');
insert into test_table(7,8,9,'c');

CREATE OR REPLACE FUNCTION public.func()
RETURNS SETOF test_table AS
'declare
_query varchar;
_record test_table%ROWTYPE;
begin
_query=\'SELECT f2,f3 FROM ....\';

for _record IN
EXECUTE _query
loop
return NEXT _record;
end loop;
return ;
end;'
LANGUAGE 'plpgsql' VOLATILE;

то при выполнении запроса
select * from func()
получиться следующее
f1 f2 f3 f4
2 3
5 6
8 9

т.е. функция возвращает два значения (f2,f3), а вот select интерпретирует их относительно _полной_ структуры таблицы, и если не может произвести преобразования между типами (если бы мы например выбирали поля f2,f4), вылетает с ошибкой.

Все это проверялось на PostgreSQL 7.3.3.
centur
Дата: 22.04.2004 08:24:31
хмм.. пока явной идеи не сформировалось - но направление мысли смотрит на rule instead и функцию с setof record либо даже функцию которая вызывает эту функцию на основе динамически сформированного запроса (части которого лежат в вспомогательной таблице.)
Драга
Дата: 22.04.2004 11:24:57
Буду рад увидеть практическую реализацию. Пока что у меня не получилось ее сотворить.
Заглянул
Дата: 22.04.2004 13:29:09
Наверно, я недопонял условия задачи. Если создать процедуру

CREATE OR REPLACE FUNCTION public.func(varchar)
RETURNS SETOF test_table AS
'declare
_query ALIAS FOR $1;
_record test_table%ROWTYPE;
begin
for _record IN
EXECUTE _query
loop
return NEXT _record;
end loop;
return ;
end;'

LANGUAGE 'plpgsql' VOLATILE;

И потом вызывать ее так:

select f1, f2 from func('select * from emp')

не получится?
Драга
Дата: 22.04.2004 15:53:47
так будет.

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

вообщем все свелось к одному, как средствами SQL выполнить запрос, текст которого возвращает функция?