2013-03-05 49 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