0

我在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}')
4

2 回答 2

1

它不起作用,因为这条线

IF( i < (array_length(node, 1) - 1))

您正在测试2or 7(取自您的示例)是否小于数组的长度,即 value 2

那是因为您的下一个查询永远不会执行。

于 2013-03-05T18:47:19.193 回答
0

由于这一行,代码的内部部分从未执行。

IF( i < (array_length(node, 1) - 1))

实际上你是i从节点数组中提取值

FOREACH i IN ARRAY node

它具有价值27与您的示例一样,并且您将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;
于 2013-03-05T19:39:46.113 回答