PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

KESALAHAN:parameter input setelah satu dengan nilai default juga harus memiliki default di Postgres

Banyak yang tidak benar dalam contoh Anda. Atau lebih tepatnya:tidak banyak adalah tepat dalam contoh Anda.

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;

Poin utama

  • Pesan kesalahan berbicara sendiri:

    Itu hampir apa yang ada di manual itu :

  • Tidak masuk akal untuk menggabungkan RETURNS void dengan OUT parameter.

  • Jangan mendeklarasikan nama variabel bertabrakan dengan nama parameter. Sama sekali tidak berguna di sini.

  • operator penetapan plpgsql adalah := , bukan = .

  • Anda biasanya tidak menggunakan RAISE tingkat INFO . Anda ingin NOTICE sebagai gantinya.

  • SELECT tanpa target tidak mungkin di plpgsql, Anda ingin SELECT INTO .

  • IF diakhiri dengan END IF bukan dengan END .

Sederhanakan lebih lanjut

Gunakan COALESCE untuk mengganti IF penyataan. Fungsi agregat mengembalikan sebuah baris meskipun tabelnya kosong.
Tapi Anda juga tidak membutuhkannya. Cukup gunakan RETURNING klausa untuk mengembalikan id baru secara langsung:

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. Tabel 'poros' sederhana Postgres

  2. Masalah Jpa ManytoMany dengan Spring Boot

  3. Bagaimana cara mengembalikan file dump PostgreSQL ke database Postgres?

  4. pisahkan nama file dari jalur di postgres

  5. Apa format untuk string / URL koneksi PostgreSQL?