我在plpgsql中执行了以下函数。它工作得很好,并且返回'OK',但是由于某种原因,它在表temp中没有输入任何内容。
CREATE OR REPLACE FUNCTION public.get_route(node integer[])
RETURNS character varying AS
$BODY$DECLARE
i int := 0;
_r record;
vertex int;
BEGIN
FOREACH i IN ARRAY node
LOOP
IF( i < (array_length(node, 1) - 1))
THEN
FOR _r IN EXECUTE 'select * from shortest_path(''
select id as id, source_id::int4 as source, target_id::int4 as target, cost, reverse_cost
from network_of_point'','|| node[i] ||','|| node[i+1] ||', true, true)'
LOOP
vertex := _r.vertex_id;
EXECUTE 'insert into temp
select nextval(''road_intersection_id_seq''), point
from distinct_network_point
where distinct_network_point.id ='|| vertex;
END LOOP;
i = i + 1;
END IF;
END LOOP;
RETURN 'OK';
END;$BODY$下面是我用来调用函数的synatx:
select get_route('{2,7}')发布于 2013-03-06 02:47:19
它不能工作,因为这行
IF( i < (array_length(node, 1) - 1))您正在测试2或7 (取自您的示例)是否小于数组的长度,这就是值2。
这是因为你的下一个查询永远不会被执行。
发布于 2013-03-06 03:39:46
由于这一行,代码的内部部分永远不会执行。
IF( i < (array_length(node, 1) - 1))实际上,您正在从节点数组中提取i的值
FOREACH i IN ARRAY node它的值为2或7,如您的示例所示,并且您将i视为节点索引,这是错误的。我已经创建了一个单独的int变量值,现在我们可以使用i作为数组索引。
我认为你想要实现这一点。
CREATE OR REPLACE FUNCTION public.get_route(node integer[])
RETURNS character varying AS
$BODY$
DECLARE
i int := 1;
_r record;
vertex int;
value int;
BEGIN
FOREACH value IN ARRAY node
LOOP
IF( i < (array_length(node, 1)))
THEN
FOR _r IN EXECUTE 'select * from shortest_path(''
select id as id, source_id::int4 as source, target_id::int4 as target, cost, reverse_cost
from network_of_point'','|| node[i] ||','|| node[i+1] ||', true, true)'
LOOP
vertex := _r.vertex_id;
EXECUTE 'insert into temp
select nextval(''road_intersection_id_seq''), point
from distinct_network_point
where distinct_network_point.id ='|| vertex;
END LOOP;
i = i + 1;
END IF;
END LOOP;
RETURN 'OK';
END;
$BODY$ language plpgsql;https://stackoverflow.com/questions/15228955
复制相似问题