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

Lỗi PostgreSQL:đối số chuỗi truy vấn của EXECUTE là null

Thông báo lỗi là

Bạn có hai EXECUTE lệnh:

_query := 'CREATE TABLE public.'
        || quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
EXECUTE _query;

...

EXECUTE 'INSERT INTO public.'
      || quote_ident(_table_name) || ' VALUES ($1.*)' USING NEW;

Phần duy nhất có thể là NULLtable_name .
Cơ hội duy nhất cho table_name trở thành NULL ở đây:

SELECT raised_local_time FROM notifications WHERE id=_notification_id
INTO _raised_local_time;

Vì vậy, nguyên nhân phải là một trong hai lý do :

  1. NEW.notification_idNULL .

  2. Không có hàng nào trong notifications cho NEW.notification_id đã cho .

Hãy thử chức năng kích hoạt đã sửa đổi này để gỡ lỗi :
CREATE OR REPLACE FUNCTION partition_evidence_by_month()
  RETURNS trigger AS
$func$
DECLARE 
   _table_name text;
BEGIN
   SELECT 'evidence-' || to_char(raised_local_time, 'YYYY-MM')
   FROM   public.notifications -- schema-qualify to be sure
   WHERE  id = NEW.notification_id
   INTO   _table_name;

   IF _table_name IS NULL THEN
      RAISE EXCEPTION '_table_name is NULL. Should not occur!';
   END IF;

   IF NOT EXISTS (   -- create table if it does not exist
      SELECT 1
      FROM   pg_catalog.pg_class c
      JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
      WHERE  c.relkind = 'r'
      AND    c.relname = _table_name
      AND    n.nspname = 'public') THEN

      EXECUTE 'CREATE TABLE public.'
            || quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
   END IF;

   EXECUTE 'INSERT INTO public.'
         || quote_ident(_table_name) || ' VALUES $1'  -- Use NEW row directly
   USING  NEW;       -- write data to the partition table

   RETURN NULL;
END
$func$ LANGUAGE plpgsql;
  • Loại bỏ các biến không sử dụng và đơn giản hóa mã. (Đây rõ ràng là một ví dụ đơn giản hóa.)

    • Trong số những thứ khác, bạn không cần date_trunc() ở tất cả. Chỉ cần cung cấp dấu thời gian ban đầu cho to_char() .

    • Không ích gì khi sử dụng varchar(n) . Chỉ cần sử dụng text hoặc varchar .

    • Tránh quá nhiều nhiệm vụ không cần thiết - tương đối đắt trong PL / pgSQL.

  • Thêm RAISE để kiểm tra giả thuyết của tôi.
    Nếu bạn nhận được thông báo lỗi, việc phân biệt giữa hai nguyên nhân có thể xảy ra sẽ là bước tiếp theo. Nên tầm thường ...




  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ố lượng hàng truy vấn được phân tách theo phạm vi ngày

  2. Làm cách nào để chỉ định cơ sở dữ liệu đang hoạt động hiện tại cho tập lệnh khởi tạo của vùng chứa postgres docker?

  3. Flask-SQLAlchemy db.session.query (Model) so với Model.query

  4. Cách triển khai số đếm Oracle (riêng biệt) qua phân vùng trong Postgres

  5. postgresql 9.5:cố gắng chia một chuỗi thành hai trường dựa trên dấu cách