sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL-fel:frågesträngsargument för EXECUTE är null

Felmeddelandet är

Du har två EXECUTE kommandon:

_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;

Den enda delen som kan vara NULL är table_name .
Enda chansen för table_name för att bli NULL är här:

SELECT raised_local_time FROM notifications WHERE id=_notification_id
INTO _raised_local_time;

Så orsaken måste vara en av två anledningar :

  1. NEW.notification_id är NULL .

  2. Det finns ingen rad i notifications för den givna NEW.notification_id .

Prova den här modifierade triggerfunktionen för felsökning :
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;
  • Ta bort oanvända variabler och förenkla koden. (Detta är uppenbarligen ett förenklat exempel.)

    • Bland annat behöver du inte date_trunc() alls. Mata helt enkelt den ursprungliga tidsstämpeln till to_char() .

    • Ingen idé att använda varchar(n) . Använd bara text eller varchar .

    • Undvik för många uppdrag där onödiga - jämförelsevis dyra i PL/pgSQL.

  • Lägg till en RAISE för att kontrollera min hypotes.
    Om du får felmeddelandet skulle det vara nästa steg att skilja mellan de två möjliga orsakerna. Borde vara trivialt ...




  1. Finns det någon skillnad mellan IS NULL och =NULL

  2. Databasversion / Ändringskontroll för data inte schema?

  3. Laravel vältalig frågebyggare - Summa med grupp om relation

  4. RoleProvider .NET 2 - konverterad från MS Access till MySQL