इसे यह करना चाहिए:
CREATE OR REPLACE FUNCTION device_bid_modifiers_count_per()
RETURNS TRIGGER AS
$func$
DECLARE
devices_count int := device_types_count();
table_name regclass := TG_ARGV[0];
column_name text := TG_ARGV[1];
BEGIN
LOCK TABLE device_types IN EXCLUSIVE MODE;
EXECUTE format('LOCK TABLE %s IN EXCLUSIVE MODE', table_name);
IF TG_OP = 'DELETE' THEN
PERFORM validate_bid_modifiers_count(table_name
, column_name
, (row_to_json(OLD) ->> column_name)::bigint
, devices_count);
ELSE
PERFORM validate_bid_modifiers_count(table_name
, column_name
, (row_to_json(NEW) ->> column_name)::bigint
, devices_count);
END IF;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
त्रुटि संदेश का तात्कालिक कारण बाहरी SELECT
था . लक्ष्य के बिना, आपको इसे PERFORM
. से बदलना होगा plpgsql में। लेकिन आंतरिक PERFORM
EXECUTE
. को पास की गई क्वेरी स्ट्रिंग में गलत भी था। PERFORM
एक plpgsql कमांड है, जो EXECUTE
. को पास की गई SQL स्ट्रिंग में मान्य नहीं है , जो SQL कोड की अपेक्षा करता है। आपको SELECT
. का उपयोग करना होगा वहां। अंत में OLD
और NEW
EXECUTE
. के अंदर दिखाई नहीं दे रहे हैं और क्या प्रत्येक अपना एक अपवाद उठाएगा जिस तरह से आपके पास था। EXECUTE
. को छोड़कर सभी समस्याओं का समाधान किया जाता है ।
डायनामिक कॉलम नाम . का मान प्राप्त करने का एक सरल और तेज़ तरीका पंक्ति प्रकारों से OLD
और NEW
:json
. पर कास्ट करें , तो आप प्रदर्शित किए गए कुंजी नाम को पैरामीटर कर सकते हैं। डायनेमिक SQL वाले विकल्प की तुलना में थोड़ा सरल और तेज़ होना चाहिए - जो संभव भी है, जैसे:
...
EXECUTE format('SELECT validate_bid_modifiers_count(table_name
, column_name
, ($1.%I)::bigint
, devices_count)', column_name)
USING OLD;
...
संबंधित:
एक तरफ:सुनिश्चित नहीं है कि आपको भारी तालों की आवश्यकता क्यों है।
इसके अलावा 2:इसके बजाय प्रत्येक ट्रिगर के लिए एक अलग ट्रिगर फ़ंक्शन लिखने पर विचार करें। अधिक शोर वाला DDL, लेकिन निष्पादित करने के लिए सरल और तेज़।