Postgresql PLPGSQL如何使用函数参数?
最后的工作代码 我试图与plpgsql相处,但这给我带来了困难。我试图在数据库上创建一个函数,服务器将调用该函数来扩展或创建我的地形。我不能让它编译,无论我怎么尝试,它都会阻止函数的两个参数中的一个的首次使用 我已经尝试了几种声明参数的方式(将它们称为$1的Postgresql PLPGSQL如何使用函数参数?,postgresql,parameters,plpgsql,assign,Postgresql,Parameters,Plpgsql,Assign,最后的工作代码 我试图与plpgsql相处,但这给我带来了困难。我试图在数据库上创建一个函数,服务器将调用该函数来扩展或创建我的地形。我不能让它编译,无论我怎么尝试,它都会阻止函数的两个参数中的一个的首次使用 我已经尝试了几种声明参数的方式(将它们称为$1的别名,或使用名称声明它们,如下代码所示),我还尝试将参数类型更改为INTEGER或NUMERIC CREATE FUNCTION public.generate_terrain ( inner NUMERIC, outer NUMER
别名,或使用名称声明它们,如下代码所示),我还尝试将参数类型更改为INTEGER
或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轴,因为实际上它是六边形贴图)的连贯“单元”填充我的数据库。必须能够调用此函数来扩展它们的地图,因此,如果我的初始调用是生成地形(0,2)
它必须生成以下地形:
#####
#####
##0##
#####
#####
#########
#########
## ##
## ##
## 0 ##
## ##
## ##
#########
#########
(0
是网格(0,0)的中心)
其中,坐标范围从左下角的(-2,-2)到右上角的(2,2)。稍后,当我需要展开地图时,我必须能够调用generate_terrain(3,4)
来生成我的地形的以下单元:
#####
#####
##0##
#####
#####
#########
#########
## ##
## ##
## 0 ##
## ##
## ##
#########
#########
(0
是网格(0,0)的中心)
其中,坐标范围从左下角的(-4,-4)到右上角的(4,4),但数据库中已存在内部“正方形”
我最终使用的功能如下所示:
CREATE OR REPLACE FUNCTION public.generate_terrain (
_inner integer,
_outer integer
)
RETURNS integer AS
$body$
DECLARE
q integer = 0;
r integer = 0;
BEGIN
q := q - _outer;
r := r - _outer;
WHILE q <= _outer
LOOP
WHILE r <= _outer
LOOP
-- This condition is to skip the inner square that is already
-- present in the database.
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;
r := - _outer;
END LOOP;
RETURN 1;
END;
$body$
LANGUAGE 'plpgsql'
创建或替换函数public.generate\u(
_内整数,
_外整数
)
将整数返回为
$body$
声明
q整数=0;
r整数=0;
开始
q:=q-_外部;
r:=r-_外部;
而q-
那么q<\u内部呢
r:=\u内部;
如果结束;
--在public.t_单元格(coo_q,coo_r)中插入值(q,r);
提出通知“单元格%,%”,q,r;
r:=r+1;
端环;
q:=q+1;
r:=-\u外部;
端环;
返回1;
终止
$body$
语言“plpgsql”
除了像马指出的那样使用保留字外,您还存在一些语法冲突。这将有助于:
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;
内部
和外部
是保留关键字。不能将它们用作标识符。使用不同的名称,问题就会迎刃而解。如果你坚持使用这些名称,你可以用双引号将它们括起来。不过那对我来说很烦人。只是不要对变量名使用保留关键字。非常感谢!我在这里确实犯了几个错误对不起,我确实想写q<\u inner
。我也没有提到这个函数应该做什么:我想让它在carthesian网格图中生成单元格作为正方形,但我必须能够调用它来扩展正方形,因此必须跳过“_inner”正方形,因为它已经插入到数据库中。