вопрос: SELECT into local_var column_name FROM <имя таблицы как параметр фукнкции> ? С EXECUTE это не проходит :((

ChaM
Дата: 24.09.2004 15:53:42
в функцию передаётся имя таблицы..
CREATE OR REPLACE FUNCTION function1(varchar) RETURNS integer AS'
DECLARE
table_name ALIAS FOR $1;
sql_query varchar;
qwer INTEGER;
BEGIN
-- Хочется так сделать
select INTO qwer column1 FROM table_name LIMIT 1;
-- естесно нехочет так
-- если по другому
EXECUTE ''select INTO qwer column1 FROM '' || table_name || '' LIMIT 1'';
--тоже ругается что ошибка рядом с into
return 1;
END
' LANGUAGE 'plpgsql'

Как можно разрешить этот трабл ... временно сделал геморойный вариант, но ИМХО он карявый:

.........
row_data RECORD
...........
FOR row_data IN EXECUTE ''select column1 FROM '' || table_name || '' LIMIT 1'' LOOP
qwer:=row_data.column1;
END LOOP;
4321
Дата: 24.09.2004 18:34:02
проверил. В 7.3.4 работают по крайней мере две разновидности синтаксиса
select "name" INTO "qwer" FROM test LIMIT 1
или
select test.name INTO "qwer"  LIMIT 1  
но вашей среди них точно нет. т.ч. проблема не в EXECUTE
centur
Дата: 24.09.2004 19:33:00
4321
проверил. В 7.3.4 работают по крайней мере две разновидности синтаксиса
select "name" INTO "qwer" FROM test LIMIT 1
или
select test.name INTO "qwer"  LIMIT 1  
но вашей среди них точно нет. т.ч. проблема не в EXECUTE



Хмм, это афаик вы батенька таблицы создаете на основе селекта, а человеку другое надо

По теме - вот уже почти год мы решаем у себя эту корявость именно так как и вы придумали. Найдете правильный и красивый способ - киньте в аську 864050 - займусь рефакторингом всего проекта с удовольствием, т.к. пока самого коробит.
4321
Дата: 24.09.2004 20:18:53
centur
4321
проверил. В 7.3.4 работают по крайней мере две разновидности синтаксиса
select "name" INTO "qwer" FROM test LIMIT 1
или
select test.name INTO "qwer"  LIMIT 1  
но вашей среди них точно нет. т.ч. проблема не в EXECUTE



Хмм, это афаик вы батенька таблицы создаете на основе селекта, а человеку другое надо

По теме - вот уже почти год мы решаем у себя эту корявость именно так как и вы придумали. Найдете правильный и красивый способ - киньте в аську 864050 - займусь рефакторингом всего проекта с удовольствием, т.к. пока самого коробит.


не понял, объясните дураку, что мешает вместо
EXECUTE ''select INTO qwer column1 FROM '' || table_name || '' LIMIT 1'';
писать конструкцию
EXECUTE ''select column1 INTO qwer  FROM '' || table_name || '' LIMIT 1'';
или я опять не так понимаю?
тогда разжуйте.
Shweik
Дата: 25.09.2004 20:02:58
Эта ссылка у меня лежит уже года три в разделе "EXECUTE SELECT INTO"
http://archives.postgresql.org/pgsql-admin/2001-12/msg00067.php
А все по-прежнему - EXECUTE of SELECT ... INTO is not implemented yet

Только неправильно пишете
EXECUTE ''select INTO qwer column1 FROM '' || table_name || '' LIMIT 1'';
Нужно вот так
EXECUTE ''select INTO qwer column1 FROM '' || quote_ident(table_name) || '' LIMIT 1'';
Вот тогда и получаем тему для TODO.....
4321
Дата: 01.03.2005 13:33:14
Вот и я допер, что жа нужно было человику.
Пробовал даже че-то наподобь:
SELECT INTO vd value FROM (EXECUTE ssql) AS q ;
(понятно, ша хлюпо - внешний селект не должен содержать экзекьюта - либо долже быть сам исполняться динамицки. Т.е. приходим к исходной.)

Получаица, кроме FOR ... IN EXECUTE ... LOOP; или курсора задача не решаица.
mef
Дата: 01.03.2005 14:13:27
Может так как-то?
CREATE OR REPLACE FUNCTION select_by_tabname(varchar) RETURNS setof record
AS'
declare row_data record;
BEGIN
FOR row_data IN EXECUTE ''select * FROM '' || table_name || LOOP
return next row_data;
END LOOP
END
' LANGUAGE 'plpgsql'


Дальше всю оставшуюся жизнь юзаем её:

select INTO qwer column1 FROM select_by_tabname(table_name) LIMIT 1;

Так как postgres только дома, грамматику и жизнеспособность проверить не могу
mef
Дата: 01.03.2005 14:14:19
table_name || LOOP
в смысле
table_name LOOP
фффф
Дата: 02.03.2005 03:29:58
Соседним топиком навеяло - через глобальные переменные можно чуть проще чем FOR LOOP сделать:
create or replace  function get_var_int(varname text) returns int as '
 return $vi{$_[0]};
' language plperl;

create or replace  function set_var_int(varname text, value int) returns text as '
 return $vi{$_[0]} = $_[1];
' language plperl;

CREATE OR REPLACE FUNCTION function1(varchar, varchar) RETURNS integer AS'
DECLARE
table_name ALIAS FOR $1;
field_name ALIAS FOR $2;
qwer INTEGER;
BEGIN
  EXECUTE(''select set_var_int(''''tmp'''', ''||field_name||'') FROM ''||table_name||'' LIMIT 1'');
  qwer := get_var_int(''tmp'');
  RETURN qwer;
END
' LANGUAGE plpgsql;

select function1('pg_user', 'usesysid');
4321
Дата: 02.03.2005 11:04:59
фффф
глобальные переменные...
...
' language plperl;
...

Хммм. теперь я понял, к чему это меня букварь по перлу поперло купить. Правда читать пока не перло.

Кстати, как язык (plperl) ставится в случае установки из инстоллера?