PLPGSQL如何使用函数参数?

时间:2019-07-09 14:17:33

标签: postgresql parameters plpgsql assign

最后的工作代码

我正在尝试与plpgsql相处,但是这给我带来了困难。我正在尝试在数据库上创建一个函数,服务器将调用该函数来扩展或创建地形。无论如何尝试,我都无法对其进行编译,它会阻止该函数具有的两个参数之一的首次使用。

我尝试了几种声明参数的方式(将其称为ALIAS FOR $1或使用以下代码所示的名称进行声明),我还尝试将参数类型更改为INTEGER或{ {1}}。

NUMERIC

尝试编译该错误消息:

CREATE FUNCTION public.generate_terrain (
  inner NUMERIC,
  outer NUMERIC
)
RETURNS void AS
$body$
DECLARE
q NUMERIC;
r NUMERIC;
BEGIN
q := -outer;
r := -outer;
WHILE q < outer DO
    WHILE r < outer DO
        IF(r > -inner AND r < inner AND q > -inner AND q > inner) THEN
            r := inner;
        END IF;;
        --insert into public.t_cell (coo_q, coo_r) values (q,r);
        RAISE NOTICE 'Cell %,%', q,r;
        r := r + 1;
    END WHILE;
    q := q + 1;
END WHILE;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
PARALLEL UNSAFE;

我不能让我的客户端执行循环,然后将结果推送到可能产生大量流量的数据库上,我想让我的数据库自己完成此操作,因此需要能够对此进行编译。请帮忙!

编辑1

我忘了解释我希望该函数执行的操作:我需要一个函数,该函数用笛卡尔网格图的相干“单元”填充数据库(q = x轴,r = y轴,因为实际上是六边形图) 。必须能够调用此函数来展开它们的地图,因此,如果我的初始调用是ERROR: syntax error at end of input LINE 8: q := -outer; ^ ,它必须产生跟随地形:

generate_terrain(0,2)

({##### ##### ##0## ##### ##### 是网格的中心(0,0)) 坐标范围从左下角的(-2,-2)到右上角的(2,2)。稍后,当我需要扩展地图时,我必须能够调用0来生成地形的以下单元格:

generate_terrain(3,4)

({######### ######### ## ## ## ## ## 0 ## ## ## ## ## ######### ######### 是网格的中心(0,0)) 坐标范围从左下角的(-4,-4)到右上角的(4,4),但是数据库中已经存在内部“正方形”

我最终使用的似乎起作用的功能如下:

0

1 个答案:

答案 0 :(得分:1)

除了使用诸如a_horse之类的保留字指出,您还违反了一些语法。这会起作用:

CREATE OR REPLACE FUNCTION public.generate_terrain (_inner NUMERIC, _outer NUMERIC)
  RETURNS void AS
$func$
DECLARE
   q NUMERIC := -_outer;
   r NUMERIC := -_outer;
BEGIN
WHILE q < _outer
LOOP                           -- !
    WHILE r < _outer
    LOOP                       -- !
        IF r > -_inner
       AND r <  _inner
       AND q > -_inner 
       AND q >  _inner THEN    -- ??
            r := _inner;
        END IF;                -- !
        --insert into public.t_cell (coo_q, coo_r) values (q,r);
        RAISE NOTICE 'Cell %,%', q,r;
        r := r + 1;
    END LOOP;                  -- !
    q := q + 1;
END LOOP;                      -- !
END
$func$  LANGUAGE plpgsql;

但这似乎不必要地扭曲了。完全不会使用_inner。您是否有意写q < _inner? (仍然很奇怪。)

否则,您可以改用它:

CREATE OR REPLACE FUNCTION public.generate_terrain_simple (_outer int)
  RETURNS void AS
$func$
INSERT INTO public.t_cell (coo_q, coo_r)
SELECT -_outer, g FROM generate_series (-_outer, _outer -1) g
$func  LANGUAGE sql;