sql >> Databáze >  >> RDS >> PostgreSQL

Chyba PostgreSQL:argument řetězce dotazu EXECUTE je null

Chybová zpráva je

Máte dva příkazy EXECUTE příkazy:

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

Jediná část, která může být NULL je table_name .
Jediná šance pro table_name stát se NULL je zde:

SELECT raised_local_time FROM notifications WHERE id=_notification_id
INTO _raised_local_time;

Příčina tedy musí být jeden ze dvou důvodů :

  1. NEW.notification_id je NULL .

  2. V notifications není žádný řádek pro dané NEW.notification_id .

Vyzkoušejte tuto upravenou spouštěcí funkci pro ladění :
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;
  • Odstraňte nepoužívané proměnné a zjednodušte kód. (Toto je samozřejmě zjednodušený příklad.)

    • Mimo jiné nepotřebujete date_trunc() vůbec. Jednoduše vložte původní časové razítko do to_char() .

    • Nemá smysl používat varchar(n) . Jednoduše použijte text nebo varchar .

    • Vyhněte se příliš mnoha přiřazením tam, kde to není nutné – v PL/pgSQL je to poměrně drahé.

  • Přidejte RAISE pro ověření mé hypotézy.
    Pokud se vám zobrazí chybová zpráva, dalším krokem by bylo rozlišení mezi dvěma možnými příčinami. Mělo by to být triviální ...




  1. Připojte se k ONLINE MySQL databázi pomocí DSN ODBC

  2. Lepší správa paměti (haldy) na Solaris 10

  3. django - agregace klíčů specifických pro pole json a pořadí podle agregace

  4. Výjimka Postgres:Dotaz nevrátil žádné výsledky.