Я пытаюсь написать функцию plpgsql, которая проходит через таблицу. В каждом цикле он вытягивает строку из таблицы, сохраняет ее в записи, а затем использует эту запись в предложении соединения запроса. Вот мой код:Использование строки в виде таблицы в запросе внутри функции PLpgSQL
CREATE OR REPLACE FUNCTION "testfncjh2"() RETURNS int
IMMUTABLE
SECURITY DEFINER
AS $dbvis$
DECLARE
counter int;
tablesize int;
rec1 record;
tablename text;
rec2 record;
BEGIN
counter = 0;
for rec1 in SELECT * FROM poilocations_sridconv loop
raise notice 'here';
execute $$ select count(*) from $$||rec1||$$ $$ into tablesize;
while counter < tablesize loop
counter = counter + 1;
raise notice 'hi';
execute $$ select count(*) from cities_sridconv $$ into tablesize;
end loop;
end loop;
return counter;
END;
$dbvis$ LANGUAGE plpgsql;
Каждый раз, когда я запускаю это, я получаю следующее сообщение об ошибке:
ERROR: could not find array type for data type record
Есть ли способ использовать строку в виде таблицы в запросе внутри вложенных циклов?
Моя конечная цель - построить функцию, которая проходит через таблицу, вытягивая строку из этой таблицы в каждом цикле. В каждом цикле вычисляется номер COUNTER с использованием строки, затем выполняется запрос в зависимости от строки и COUNTER. Зная, что этот код в настоящее время очень испорчено, я отправляю его ниже, чтобы дать представление о том, что я пытаюсь сделать:
CREATE OR REPLACE FUNCTION «testfncjh»() возвращает пустого непреложного DEFINER БЕЗОПАСНОСТИ AS $ dbvis $ DECLARE counter int; tablesize int; rec1 запись; tablename текст; rec2 запись; НАЧАТЬ
for rec1 in SELECT * FROM poilocations_sridconv loop
counter = 0;
execute $$ select count(*)
from $$||rec1||$$ a
join
cities_srid_conv b
on right(a.geom_wgs_pois,$$||counter||$$) = right(b.geom_wgs_pois,$$||counter||$$) $$ into tablesize;
raise notice 'got through first execute';
while tablesize = 0 loop
counter = counter + 1;
execute $$ select count(*)
from '||rec1||' a
join
cities_srid_conv b
on right(a.geom_wgs_pois,'||counter||') = right(b.geom_wgs_pois,'||counter||') $$ into tablesize;
raise notice 'hi';
end loop;
EXECUTE
'select
poiname,
name as cityname,
postgis.ST_Distance(postgis.ST_GeomFromText(''POINT(poilat poilong)''),
postgis.ST_GeomFromText(''POINT(citylat citylong)'')
) as distance
from (select a.poiname,
a.latitude::text as poilat,
a.longitude::text as poilong,
b.geonameid,
b.name,
b.latitude as citylat,
b.longitude as citylong
from '||rec1||' a
join cities_srid_conv b
on right(a.geom_wgs_pois,'||counter||') = right(b.geom_wgs_pois,'||counter||'))
) x
order by distance
limit 1'
poi_cities_match (poiname, cityname, distance); ------SQL STATEMENT TO INSERT CLOSEST CITY TO TABLE POI_CITIES_MATCH
end loop;
END;
$dbvis$ LANGUAGE plpgsql;
Я бегу на базе данных PostgreSQL 8.2.15.
Также, извините за повторную отправку. Мне пришлось удалить некоторые данные из оригинала.