plpgsql函数没有结果

时间:2013-03-05 16:23:47

标签: 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

    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}')

2 个答案:

答案 0 :(得分:1)

它不起作用,因为这行

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

您正在测试27(取自您的示例)是否小于数组的长度,该值的值为2

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

答案 1 :(得分: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;