Postgresql PLPGSQL如何使用函数参数?

Postgresql PLPGSQL如何使用函数参数?,postgresql,parameters,plpgsql,assign,Postgresql,Parameters,Plpgsql,Assign,最后的工作代码 我试图与plpgsql相处,但这给我带来了困难。我试图在数据库上创建一个函数,服务器将调用该函数来扩展或创建我的地形。我不能让它编译,无论我怎么尝试,它都会阻止函数的两个参数中的一个的首次使用 我已经尝试了几种声明参数的方式(将它们称为$1的别名,或使用名称声明它们,如下代码所示),我还尝试将参数类型更改为INTEGER或NUMERIC CREATE FUNCTION public.generate_terrain ( inner NUMERIC, outer NUMER

最后的工作代码

我试图与plpgsql相处,但这给我带来了困难。我试图在数据库上创建一个函数,服务器将调用该函数来扩展或创建我的地形。我不能让它编译,无论我怎么尝试,它都会阻止函数的两个参数中的一个的首次使用

我已经尝试了几种声明参数的方式(将它们称为$1的
别名,或使用名称声明它们,如下代码所示),我还尝试将参数类型更改为
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”正方形,因为它已经插入到数据库中。