PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL त्रुटि:EXECUTE का क्वेरी स्ट्रिंग तर्क शून्य है

त्रुटि संदेश है

आपके पास दो EXECUTE हैं आदेश:

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

एकमात्र भाग जो NULL हो सकता है है table_name .
table_name . के लिए एकमात्र मौका बनने के लिए NULL यहाँ है:

SELECT raised_local_time FROM notifications WHERE id=_notification_id
INTO _raised_local_time;

तो कारण दो कारणों में से एक होना चाहिए :

  1. NEW.notification_id है NULL

  2. notifications में कोई पंक्ति नहीं है दिए गए NEW.notification_id . के लिए ।

यह डिबगिंग के लिए संशोधित ट्रिगर फ़ंक्शन आज़माएं :
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;
  • अप्रयुक्त चर निकालें और कोड को सरल बनाएं। (यह स्पष्ट रूप से एक सरलीकृत उदाहरण है।)

    • अन्य बातों के अलावा, आपको date_trunc() की आवश्यकता नहीं है बिल्कुल भी। बस मूल टाइमस्टैम्प को to_char() . पर फीड करें ।

    • varchar(n) . का उपयोग करने का कोई मतलब नहीं है . बस text का उपयोग करें या varchar

    • पीएल/पीजीएसक्यूएल में बहुत अधिक असाइनमेंट से बचें जहां अनावश्यक - तुलनात्मक रूप से महंगा हो।

  • एक RAISE जोड़ें मेरी परिकल्पना की जाँच करने के लिए।
    यदि आपको त्रुटि संदेश मिलता है, तो दो संभावित कारणों के बीच भेदभाव करना अगला कदम होगा। तुच्छ होना चाहिए...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में एक पंक्ति के बाइट आकार का पता लगाएं

  2. क्वेरी में शामिल होने का उपयोग करके पंक्तियों को पुनः प्राप्त करना

  3. पोस्टग्रेज में डुप्लिकेट पंक्तियों को हटाना

  4. PostgreSQL:डिफ़ॉल्ट बाधा नाम

  5. Postgres में समग्र JSONB सरणी क्वेरी?