имя таблицы как параметр для PL/pgSQL

Vitallium
Дата: 16.10.2003 13:46:44
Можно ли в Postgres в PL/pgSQL в качестве параметра передавать имя таблицы ? В хранимой процедуре должен быть прописан запрос, в котором имя таблицы заранее неизвестно, а передаётся функции в качестве параметра.
Я пробовал так, но Postgres ругается:

create function myfunc(text) returns int4 as
'declare
tablename alias for $1;
result int4;
begin
result:=(select count(*) from tablename);
return(result);
end;
'
language 'plpgsql'
Stellar.
Дата: 16.10.2003 15:56:31
нет
Sad Spirit
Дата: 16.10.2003 16:00:01

create function myfunc(text) returns int4 as
'declare
tablename alias for $1;
result int4;
begin
result:=execute '
'select count(*) from '' || quote_ident(tablename);
return(result);
end;
'
language 'plpgsql'
Shweik
Дата: 16.10.2003 16:44:02
2 Sad Spirit Нет так тоже не получится!
Почти правильно так :
create or replace function myfunc(text) returns int4 as
' declare tablename alias for $1;
DECLARE tmprec RECORD;
declare res1 int4;
begin
execute ''select count(*) as cnt into tmprec from '' || quote_ident(tablen
res1 :=tmprec.cnt;
return(res1);--tmp_record.cnt
end;
'language 'plpgsql'
Но почти- несчитается потому что почти это тоже ошибка 8))
Смотрите сами :
myfunc1 - вариант предложенный Sad Spirit
myfunc - приведенный в этом посте.
avalon|R1>psql -q -c "select myfunc1('classes') " tests
WARNING: Error occurred while executing PL/pgSQL function myfunc1
WARNING: line 9 at assignment
ERROR: Type "execute" does not exist
---------------------------------------------------------------------------------------------------------
avalon|R1>psql -q -c "select myfunc('classes') " tests
WARNING: Error occurred while executing PL/pgSQL function myfunc
WARNING: line 5 at execute statement
ERROR: EXECUTE of SELECT ... INTO is not implemented yet
Кабы этот чертов форум так не глючил .....
А вообще в доке написано
The results from SELECT queries are discarded by EXECUTE, and SELECT INTO is not currently supported within EXECUTE. So, the only way to extract a result from a dynamically-created SELECT is to use the FOR-IN-EXECUTE form described later.
Те придется считать записи в цикле FOR .... что тоже не ахти.