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

2または7(例から取得) が配列の長さよりも小さいかどうかをテストしています2

これは、次のクエリが実行されないためです。

于 2013-03-05T18:47:19.193 に答える
0

この行のため、コードの内部部分は実行されませんでした。

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

実際にはi、ノード配列からの値を抽出しています

FOREACH i IN ARRAY node

あなたの例のように価値があり2、間違っているノードインデックスとして扱っています。別の変数値を作成しました。これで、配列インデックスとして使用できます。7iinti

あなたはこれを達成したいと思います。

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 に答える