错误:具有默认值的输入参数也必须具有默认值

Mee*_*eem 2 postgresql plpgsql default-value

我试图将默认值设置为参数列表中的函数内的变量,但收到错误:

 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 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)

Erw*_*ter 6

在你的例子中,这是不对的.或者更确切地说:在你的例子中没有多少对的.

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 voidOUT参数结合是没有意义的.

  • 不要声明变量名与参数名冲突.这里完全没用.

  • 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)