我的函数代码如下:
CREATE OR REPLACE FUNCTION INC(init_val)
RETURNS INTEGER AS $INVAL$
DECLARE CUR_VAL INTEGER;
BEGIN
CUR_VAL := (SELECT MAX(val_num) FROM values);
CUR_VAL := CUR_VAL+init_val;
INSERT INTO values VALUES (CUR_VAL);
RETURN CUR_VAL;
end;
$INVAL$ LANGUAGE plpgsql
我正在尝试检查init_val是否为空。你是怎么做到的?
您的函数表现出多个问题。而且描述有矛盾。
这可能会完成您正在寻找的内容:
CREATE OR REPLACE FUNCTION f_values_inc(_init_val int)
RETURNS integer
LANGUAGE sql AS
$INVAL$
INSERT INTO values (val_num)
SELECT COALESCE(MAX(val_num), _init_val, 0) + 1
FROM values
RETURNING val_num;
$INVAL$;
叫:
SELECT f_values_inc(7);
但这只是一个概念证明。我没有看到用例。如前所述,该函数无法处理表上的并发写入。
请考虑改用serial
或IDENTITY
列,这两者都设计为在并发写入负载下不会中断。看:
- 自动递增表列
旁白:避免使用values
等 SQL 关键字作为标识符。虽然这在Postgres中基本上是允许的,但它在标准SQL中是保留的。仅使用合法的、小写的、不带引号的标识符,让您在 Postgres 的生活更轻松。看:
- PostgreSQL 列名是否区分大小写?