Arrays 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

我在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$

因为这条线不行

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;