首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >plpgsql函数无结果

plpgsql函数无结果
EN

Stack Overflow用户
提问于 2013-03-06 00:23:47
回答 2查看 99关注 0票数 0

我在plpgsql中执行了以下函数。它工作得很好,并且返回'OK',但是由于某种原因,它在表temp中没有输入任何内容。

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
select get_route('{2,7}')
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-06 02:47:19

它不能工作,因为这行

代码语言:javascript
运行
复制
IF( i < (array_length(node, 1) - 1))

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-06 03:39:46

由于这一行,代码的内部部分永远不会执行。

代码语言:javascript
运行
复制
IF( i < (array_length(node, 1) - 1))

实际上,您正在从节点数组中提取i的值

代码语言:javascript
运行
复制
FOREACH i IN ARRAY node

它的值为27,如您的示例所示,并且您将i视为节点索引,这是错误的。我已经创建了一个单独的int变量值,现在我们可以使用i作为数组索引。

我认为你想要实现这一点。

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15228955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档