PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

LỖI:các tham số đầu vào sau một tham số có giá trị mặc định cũng phải có giá trị mặc định trong Postgres

Nhiều điều không đúng trong ví dụ của bạn. Hay đúng hơn:không nhiều ngay trong ví dụ của bạn.

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;

Những điểm chính

  • Thông báo lỗi tự nói lên:

    Đó gần như là những gì hướng dẫn sử dụng :

  • Sẽ không hợp lý nếu kết hợp RETURNS void với OUT tham số.

  • Không khai báo tên biến xung đột với tên tham số. Hoàn toàn vô dụng ở đây.

  • toán tử gán plpgsql là := , không phải = .

  • Bạn thường không sử dụng RAISE cấp độ THÔNG TIN . Bạn muốn THÔNG BÁO thay vào đó.

  • CHỌN không có mục tiêu là không thể trong plpgsql, bạn muốn CHỌN VÀO .

  • IF được kết thúc bằng END IF không bằng END .

Đơn giản hóa hơn nữa

Sử dụng COALESCE để thay thế IF của bạn bản tường trình. Các hàm tổng hợp trả về một hàng ngay cả khi bảng trống.
Nhưng bạn cũng không cần điều đó. Chỉ cần sử dụng RETURNING mệnh đề để trả về id mới trực tiếp:

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. Sử dụng .pgpass từ Apache libphp5.so

  2. Các phương pháp hay nhất về sao chép PostgreSQL - Phần 1

  3. psycopg2 và tập lệnh python vô hạn

  4. pg_dump bỏ qua trình tự bảng?

  5. Cập nhật các bản ghi thỏa mãn một điều kiện với số lượng tăng dần