你的例子中有很多不正确的地方。或者更确切地说:不多is就在你的例子中。
CREATE OR REPLACE FUNCTION f_test(
name text = NULL
, city text = NULL
, phonenumber text = NULL
,address text = NULL
, OUT sno bigint)
RETURNS void AS
$func$
DECLARE
phonenumber AS VarChar(20); -- would collide with parameter name
BEGIN
phonenumber := phonenumber; -- nonsense
SELECT INTO sno max(ssno) + 1 FROM emp; -- SELECT INTO for assignment
IF sno IS NULL THEN
sno := ident_current('emp') + 1;
END IF;
RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
VALUES (name, city, phonenumber, address);
END
$func$ LANGUAGE plpgsql;
主要观点
-
错误消息不言而喻:
具有默认值的输入参数之后也必须具有默认值。
这差不多了手册中有什么内容:
具有默认值的参数后面的所有输入参数都必须
也有默认值。
结合起来没有意义RETURNS void
with OUT
参数。
不要声明与参数名称冲突的变量名称。这里完全没用。
The plpgsql 赋值运算符是:=, not =
.
您通常不使用RAISE
level INFO
。你要NOTICE
反而。
SELECT
没有目标在 plpgsql 中是不可能的,你想要SELECT INTO
.
IF
终止于END IF
不与END
.
进一步简化
Use COALESCE来代替你的IF
陈述。即使表为空,聚合函数也会返回一行。
但你也不需要那个。只需使用RETURNING
子句直接返回新的 id:
CREATE OR REPLACE FUNCTION f_test(
name text = NULL
, city text = NULL
, phonenumber text = NULL
, address text = NULL
, OUT sno bigint)
AS
$func$
BEGIN
RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
VALUES (name, city, phonenumber, address)
RETURNING ssno
INTO sno; -- Assuming you want to return autoincremented id
END
$func$ LANGUAGE plpgsql;