2013-03-05 51 views
0

我在plpgsql中做了以下功能。它工作正常,它返回'OK',但由于某种原因它没有在表temp表中输入任何内容。plpgsql函数无结果

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

您在调用函数后执行'COMMIT'吗? – 2013-03-05 16:43:40

+0

你提交什么意思?显然,如果你的意思是这样的话,我已经完成了对查询的执行。 @IgorRomanchenko – 2013-03-05 17:45:22

+0

尝试在执行前打印顶点的值。如果它为空,则查询将失败。 – 2013-03-05 18:11:59

回答

1

它不工作,因为这条线

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

您正在测试,如果27 (取自你的例子)小于数组的长度,这是价值2

这是因为您的下一个查询从未执行。

+0

但是我仍然获得NULLE ERROR。我如何可以参考数组的元素,例如ex:node [i + 1] @DavideBerra – 2013-03-05 19:00:39

+0

您不必在意... foreach会为您做...数组中每个元素的值存储到i变量(这不是一个索引)。把一个提升信息'我的价值:%',我;在第一次LOOP之后,你会明白我的意思。 – 2013-03-05 19:18:22

0

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

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

其实你是从哪些具有价值27在你的榜样节点阵列

FOREACH i IN ARRAY node 

提取i价值,你是治疗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; 
+0

而不是使用节点[i],你可以直接使用值。 – 2013-03-05 21:49:55