Arrays plpgsql函数没有结果
我在plpgsql中完成了以下功能。它工作正常,返回Arrays plpgsql函数没有结果,arrays,function,postgresql,plpgsql,Arrays,Function,Postgresql,Plpgsql,我在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 L
'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$
因为这条线不行
IF( i < (array_length(node, 1) - 1))
IF(i<(数组长度(节点,1)-1))
您正在测试2
或7
(取自您的示例)是否小于数组的长度,即值2
这是因为您的下一个查询永远不会执行。由于这一行,代码的内部部分永远不会执行
IF( i < (array_length(node, 1) - 1))
它的值为2
或7
,如您的示例所示,您将i
视为节点索引,这是错误的。我已经创建了一个单独的int
变量值,现在我们可以使用I
作为数组索引
我认为你想要实现这一点
创建或替换函数public.get_route(节点整数[])
返回变量为的字符
$BODY$
声明
i int:=1;
_r记录;
顶点int;
值int;
开始
数组节点中的FOREACH值
环
如果(i<(数组长度(节点,1)))
然后
对于“执行”中的“从最短路径中选择”
选择id作为id,source\u id::int4作为source,target\u id::int4作为target,cost,reverse\u cost
从网络_点“”,“| |节点[i]| |',“| |节点[i+1]| |',真,真”
环
顶点:=\u r.vertex\u id;
执行“插入到临时
选择下一个(“道路交叉口id顺序”),点
从不同的网络点
其中,distinct_network_point.id='| |顶点;
端环;
i=i+1;
如果结束;
端环;
返回“OK”;
结束;
$BODY$语言plpgsql;
调用函数后是否执行COMMIT
操作?COMMIT是什么意思?。显然,如果你是这样想的话,我已经对查询执行过了@igorromanchenko尝试在执行之前打印顶点的值。如果为空,查询将失败。我该怎么做呢?使用加薪通知@DavideBerra提升信息“顶点:%”,顶点代码>但我仍然得到null错误。我如何引用数组中的元素,比如ex:node[I+1]@davideberra,你不必在意。。。foreach会为你做的。。。数组中每个元素的值都存储在i变量中(该变量不是索引)。放入加薪信息“I值:%”,I;在第一个循环之后,您将得到我的意思。您可以直接使用value而不是node[i]。
IF( i < (array_length(node, 1) - 1))
FOREACH i IN ARRAY node
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;