Mee*_*eem 2 postgresql plpgsql default-value
我试图将默认值设置为参数列表中的函数内的变量,但收到错误:
Run Code Online (Sandbox Code Playgroud)Create or replace function test(name varchar default null , city varchar default null , phonenumber varchar(20) default null , out sno bigint, address varchar) returns void as $$ Declare phonenumber AS VarChar(20); Begin phonenumber : =phonenumber; SELECT sno = MAX(ssno)+1 FROM emp; IF(sno IS NULL) then sno=IDENT_CURRENT('emp')+1; end; raise info '%',name; raise info '%',city; raise info '%',phonenumber; raise info '%',address; insert into emp(ename,ecity,ephonenumber,eaddress) values(name,city,phonenumber,address); end; $$ langauge plpgsql;
Create or replace function test(name varchar default null
, city varchar default null
, phonenumber varchar(20) default null
, out sno bigint, address varchar)
returns void as
$$
Declare
phonenumber AS VarChar(20);
Begin
phonenumber : =phonenumber;
SELECT sno = MAX(ssno)+1 FROM emp;
IF(sno IS NULL) then
sno=IDENT_CURRENT('emp')+1;
end;
raise info '%',name;
raise info '%',city;
raise info '%',phonenumber;
raise info '%',address;
insert into emp(ename,ecity,ephonenumber,eaddress)
values(name,city,phonenumber,address);
end;
$$
langauge plpgsql;
Run Code Online (Sandbox Code Playgroud)
在你的例子中,这是不对的.或者更确切地说:在你的例子中没有多少是对的.
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;Run Code Online (Sandbox Code Playgroud)
错误消息说明了一切:
具有默认值的输入参数也必须具有默认值.
这就是手册上的内容:
具有默认值的参数后面的所有输入参数也必须具有默认值.
RETURNS void与OUT参数结合是没有意义的.
不要声明变量名与参数名冲突.这里完全没用.
该PLPGSQL赋值运算符是:=,不=.
您通常不使用该RAISE级别INFO.你想要的NOTICE.
SELECT没有目标在plpgsql中是不可能的,你想要的SELECT INTO.
IF终止时END IF没有END.
使用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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2815 次 |
| 最近记录: |