最后的工作代码
我正在尝试与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;
我不能让我的客户端执行循环,然后将结果推送到可能产生大量流量的数据库上,我想让我的数据库自己完成此操作,因此需要能够对此进行编译。请帮忙!
我忘了解释我希望该函数执行的操作:我需要一个函数,该函数用笛卡尔网格图的相干“单元”填充数据库(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
答案 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;