【问题标题】:plpgsql function no resultsplpgsql 函数没有结果
【发布时间】:2013-02-20 03:47:58
【问题描述】:

我在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$

以下是我用来调用函数的语法:

select get_route('{2,7}')

【问题讨论】:

  • 你调用函数后会COMMIT吗?
  • 提交是什么意思?显然,如果您的意思是这样,我已经执行了查询。 @IgorRomanchenko
  • 尝试在执行前打印顶点的值。如果为 null,则查询将失败。
  • 我该怎么做呢?使用加薪通知? @DavideBerra
  • RAISE INFO 'vertex: %', vertex;

标签: arrays function postgresql plpgsql


【解决方案1】:

这行不行,因为这条线

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

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

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

【讨论】:

  • 但我仍然得到 NULLE 错误。我如何引用数组的元素,例如:node[i+1] @DavideBerra
  • 您不必关心... foreach 会为您完成...数组中每个元素的值都存储在 i 变量中(这不是索引)。放一个 RAISE INFO 'I VALUE: %', i;就在第一个循环之后,你就会明白我的意思。
【解决方案2】:

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

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

实际上你是从节点数组中提取i 的值

FOREACH i IN ARRAY node

在您的示例中具有 2 或 7 的值,并且您将 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;

【讨论】:

  • 不使用node[i],直接使用value即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多