sql >> Database teknologi >  >> RDS >> PostgreSQL

FEJL:Indtastningsparametre efter en med en standardværdi skal også have standardindstillinger i Postgres

Meget er ikke rigtigt i dit eksempel. Eller rettere:ikke meget er lige i dit eksempel.

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;

Vigtige punkter

  • Fejlmeddelelsen taler for sig selv:

    Det er næsten hvad manualen har om det :

  • Det ville ikke give mening at kombinere RETURNS void med OUT parametre.

  • Erklær ikke variabelnavne, der kolliderer med parameternavne. Fuldstændig ubrugelig her.

  • plpgsql-tildelingsoperatøren er := , ikke = .

  • Du bruger normalt ikke RAISE niveau INFO . Du vil have BEMÆRK i stedet.

  • VÆLG uden mål er ikke muligt i plpgsql, du vil have SELECT INTO .

  • HVIS afsluttes med END IF ikke med END .

Gør yderligere forenkling

Brug COALESCE for at erstatte din IF udmelding. Samlede funktioner returnerer en række, selvom tabellen er tom.
Men det behøver du heller ikke. Brug bare RETURNING klausul for at returnere det nye id direkte:

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;


  1. ServiceStack:Tester OrmLite, installeret med NuGet, men jeg får fejlen FileNotFoundException

  2. Sådan fungerer Sind() i PostgreSQL

  3. Hvordan afkodes PostgreSQL bytea kolonne hex til int16/uint16 i r?

  4. Dupliker rækker i en primær nøgletabel.