sql >> Database >  >> RDS >> PostgreSQL

FOUT:invoerparameters na één met een standaardwaarde moeten ook standaardwaarden hebben in Postgres

Veel klopt er niet in jouw voorbeeld. Of liever:niet veel is precies in jouw voorbeeld.

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;

Belangrijkste punten

  • De foutmelding spreekt voor zich:

    Dat is bijna wat de handleiding daarover heeft :

  • Het zou geen zin hebben om RETURNS void . te combineren met OUT parameters.

  • Declareer geen variabelenamen die botsen met parameternamen. Totaal nutteloos hier.

  • De plpgsql-toewijzingsoperator is := , niet = .

  • Normaal gesproken gebruik je de RAISE . niet niveau INFO . U wilt NOTICE in plaats daarvan.

  • SELECT zonder doel is niet mogelijk in plpgsql, je wilt SELECT INTO .

  • IF wordt beëindigd met END IF niet met END .

Vereenvoudig verder

Gebruik COALESCE ter vervanging van uw IF uitspraak. Geaggregeerde functies retourneren een rij, zelfs als de tabel leeg is.
Maar dat heb je ook niet nodig. Gebruik gewoon de RETURNING clausule om de nieuwe id direct terug te geven:

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. CASE WHEN in WHERE-component faalt met een fout die zoekwoord mist

  2. Hoe alle gerealiseerde weergaven in Postgresql 9.3 in één keer te vernieuwen?

  3. SQL-weergaven

  4. JSONB sqlalchemy Geaggregeerde functie