अनुकूलित विकल्पके लिए सभी संभावित मामलों को संभालें ए> ठीक से:
-
विकल्प अभी तक सेट नहीं है
इसके सभी संदर्भ एक अपवाद raise पैदा करते हैं , जिसमें
current_setting()
जब तक दूसरे पैरामीटरmissing_ok
. के साथ कॉल नहीं किया जाता है . मैनुअल: -
विकल्प एक वैध पूर्णांक शाब्दिक पर सेट है
-
विकल्प एक अमान्य पूर्णांक शाब्दिक पर सेट है
-
विकल्प रीसेट (जो 3 के एक विशेष मामले में जल जाता है। )
उदाहरण के लिए, यदि आप
SET LOCAL
. के साथ एक अनुकूलित विकल्प सेट करते हैं याset_config('myvars.user_id3', '55', true)
, लेन-देन के अंत में विकल्प मान रीसेट हो जाता है। यह अभी भी मौजूद है , संदर्भित किया जा सकता है, लेकिन यह अब एक खाली स्ट्रिंग देता है (''
) - जिसेinteger
. पर नहीं डाला जा सकता ।
आपके डेमो में स्पष्ट गलतियाँ एक तरफ, आपको सभी 4 मामलों की तैयारी करने की आवश्यकता है। तो:
CREATE OR REPLACE FUNCTION add_transition1()
RETURNS trigger AS
$func$
DECLARE
_user_id text := current_setting('myvars.user_id', true); -- see 1.
BEGIN
IF _user_id ~ '^\d+$' THEN -- one or more digits?
INSERT INTO transitions1 (user_id, house_id)
VALUES (_user_id::int, NEW.id); -- valid int, cast is safe
ELSE
INSERT INTO transitions1 (user_id, house_id)
VALUES (NULL, NEW.id); -- use NULL instead
RAISE WARNING 'Invalid user_id % for house_id % was reset to NULL!'
, quote_literal(_user_id), NEW.id; -- optional
END IF;
RETURN NULL; -- OK for AFTER trigger
END
$func$ LANGUAGE plpgsql;
db<>fiddle यहां
नोट:
-
स्तंभ नामों से मेल खाने वाले चर नामों से बचें। बहुत त्रुटि प्रवण। एक लोकप्रिय नामकरण परंपरा है कि चर नामों को अंडरस्कोर के साथ जोड़ा जाए:
_user_id
। -
एक असाइनमेंट को सेव करने के लिए डिक्लेरेशन टाइम पर असाइन करें। डेटा प्रकार पर ध्यान दें
text
. अमान्य इनपुट को छांटने के बाद, हम बाद में कास्ट करेंगे। -
यदि संभव हो तो अपवाद को ऊपर उठाने / फंसाने से बचें . मैनुअल:
-
वैध पूर्णांक तारों के लिए परीक्षण करें। यह सरल रेगुलर एक्सप्रेशन केवल अंकों की अनुमति देता है (कोई प्रमुख चिह्न नहीं, कोई सफेद स्थान नहीं):
_user_id ~ '^\d+$'
. मैं किसी भी अमान्य इनपुट के लिए NULL पर रीसेट करता हूं। अपनी ज़रूरतों के अनुसार अनुकूलित करें। -
मैंने एक वैकल्पिक
WARNING
जोड़ा है आपकी डिबगिंग सुविधा के लिए। -
मामले
3.
और4.
केवल इसलिए उत्पन्न होता है क्योंकि अनुकूलित विकल्प स्ट्रिंग अक्षर हैं (टाइप करेंtext
), मान्य डेटा प्रकारों को स्वचालित रूप से लागू नहीं किया जा सकता है।
संबंधित:
- PostgreSQL में उपयोगकर्ता परिभाषित चर
- क्या PostgreSQL क्वेरी में नामित स्थिरांक को परिभाषित करने का कोई तरीका है?
इसके अलावा, आपकी सटीक आवश्यकताओं के आधार पर, अनुकूलित विकल्पों के बिना आप जो करने का प्रयास कर रहे हैं, उसके लिए और अधिक सुरुचिपूर्ण समाधान हो सकते हैं। शायद यह: