PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

ГРЕШКА:входните параметри след един със стойност по подразбиране също трябва да имат стойности по подразбиране в Postgres

Много не е правилно в твоя пример. Или по-скоро:не много е точно във вашия пример.

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;

Основни точки

  • Съобщението за грешка говори само за себе си:

    Това е почти какво пише в ръководството :

  • Няма да има смисъл да комбинирате RETURNS void с OUT параметри.

  • Не декларирайте имена на променливи в конфликт с имена на параметри. Напълно безполезен тук.

  • Операторът за присвояване plpgsql е := , а не = .

  • Обикновено не използвате RAISE ниво ИНФО . Искате ИЗВЕСТИЕ вместо това.

  • ИЗБЕРЕТЕ без цел не е възможно в plpgsql, искате SELECT INTO .

  • АКО се прекратява с END IF не с END .

Опростете допълнително

Използвайте COALESCE за да замените вашия IF изявление. Агрегираните функции връщат ред, дори ако таблицата е празна.
Но вие също не се нуждаете от това. Просто използвайте ВРЪЩАНЕ клауза за директно връщане на новия идентификатор:

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. Свържете 2 таблици, където два набора от числа се припокриват в рамките на свързващите колони

  2. Изпълнете роден sql с хибернация

  3. Експортирайте CREATE скрипт за база данни

  4. Как да промените база данни на postgresql със Symfony 2.0?

  5. PostgreSQL конвенции за именуване