sql >> Databáze >  >> RDS >> PostgreSQL

CHYBA:vstupní parametry po jednom s výchozí hodnotou musí mít výchozí hodnoty také v Postgresu

Ve vašem příkladu toho není mnoho. Nebo spíše:nic moc je přímo ve vašem příkladu.

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;

Hlavní body

  • Chybová zpráva mluví sama za sebe:

    To je téměř co o tom má příručka :

  • Nedávalo by smysl kombinovat RETURNS void s OUT parametry.

  • Nedeklarujte názvy proměnných kolidující s názvy parametrů. Tady úplně k ničemu.

  • Operátor přiřazení plpgsql je := , nikoli = .

  • Běžně nepoužíváte RAISE úroveň INFO . Chcete NOTICE místo toho.

  • VYBRAT bez cíle není v plpgsql možné, chcete SELECT INTO .

  • IF je ukončeno END IF ne s END .

Další zjednodušení

Použijte COALESCE k nahrazení vašeho IF tvrzení. Agregační funkce vrátí řádek, i když je tabulka prázdná.
Ale ani to nepotřebujete. Stačí použít VRÁCENÍ klauzule pro přímé vrácení nového 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;


  1. Přečtěte si e-mail imap php

  2. Výsledkem „seskupit podle“ bude více sloupců

  3. Jak nastavit národní prostředí pro aktuální připojení v MySQL

  4. MySQL dotaz - porovnejte čísla verzí