PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

BŁĄD:parametry wejściowe po jednym z wartością domyślną muszą mieć również wartości domyślne w Postgresie

W twoim przykładzie wiele jest nie tak. A raczej:niewiele jest w twoim przykładzie.

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;

Główne punkty

  • Komunikat o błędzie mówi sam za siebie:

    To prawie co zawiera podręcznik :

  • Nie ma sensu łączyć RETURNS void z OUT parametry.

  • Nie deklaruj nazw zmiennych kolidujących z nazwami parametrów. Całkowicie bezużyteczne tutaj.

  • plpgsql operator przypisania to := , a nie = .

  • Zwykle nie używasz RAISE poziom INFO . Chcesz UWAGA zamiast tego.

  • WYBIERZ bez celu nie jest możliwe w plpgsql, chcesz WYBIERZ DO .

  • JEŻELI jest zakończony przez END IF nie z END .

Dalsze uproszczenie

Użyj COALESCE zastąpić IF oświadczenie. Funkcje agregujące zwracają wiersz, nawet jeśli tabela jest pusta.
Ale tego też nie potrzebujesz. Po prostu użyj ZWROT klauzula zwracająca nowy identyfikator bezpośrednio:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql projekt bazy danych dla e-commerce

  2. typ wydajności varchar(1) lub smallint do przechowywania statusu Postgres

  3. dlaczego postgres wyświetla jednocześnie błąd aktualizacji wiersza, gdy wyraźnie blokuję całą tabelę?

  4. Dziwne zachowanie w Postgresql

  5. Wybrane ustawienie LC_CTYPE wymaga kodowania LATIN1