sql >> Databasteknik >  >> RDS >> PostgreSQL

FEL:inmatningsparametrar efter en med ett standardvärde måste också ha standardvärden i Postgres

Mycket stämmer inte i ditt exempel. Eller snarare:inte mycket är precis i ditt exempel.

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;

Huvudpunkter

  • Felmeddelandet talar för sig självt:

    Det är nästan vad handboken har om det :

  • Det skulle inte vara vettigt att kombinera RETURNS void med OUT parametrar.

  • Deklarera inte variabelnamn som kolliderar med parameternamn. Helt värdelöst här.

  • plpgsql-tilldelningsoperatorn är := , inte = .

  • Du använder normalt inte RAISE nivå INFO . Du vill ha OBS istället.

  • VÄLJ utan mål är inte möjligt i plpgsql, du vill ha SELECT INTO .

  • OM avslutas med END IF inte med END .

Förenkla ytterligare

Använd COALESCE för att ersätta din IF påstående. Aggregatfunktioner returnerar en rad även om tabellen är tom.
Men det behöver du inte heller. Använd bara RETURNING klausul för att returnera det nya ID:t direkt:

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. Hur lägger jag till en total som den sista raden i min sql?

  2. Varför är en UDF så mycket långsammare än en underfråga?

  3. Fastnade vid det här felet:Felaktigt heltalsvärde:'' för kolumn '____' på rad 1

  4. ASIN() Funktion i Oracle