मुझे दो संभावित कारण दिखाई दे रहे हैं, क्यों...
<ब्लॉकक्वॉट>इनमें से कोई भी वृद्धि मेरे संदेश लॉग में दिखाई नहीं देती है
लॉग नहीं किया गया
सबसे पहले, एक NOTICE सामान्य रूप से डिफ़ॉल्ट सेटिंग्स के साथ डेटाबेस लॉग में नहीं लिखा जाता है। मैं यहां मैनुअल को उद्धृत करता हूं:
log_min_messages (enum )
यह नियंत्रित करता है कि सर्वर लॉग में कौन से संदेश स्तर लिखे गए हैं। मान्य मान हैं DEBUG5 , DEBUG4 , DEBUG3 , DEBUG2 , DEBUG1 , INFO , NOTICE , WARNING , ERROR , LOG , FATAL , और PANIC . (...)
डिफ़ॉल्ट चेतावनी . है . ध्यान दें कि LOG client_min_messages . की तुलना में यहां एक अलग रैंक है ।
बोल्ड जोर मेरा। अलग-अलग डिफ़ॉल्ट पर भी ध्यान दें (NOTICE ) client_min_messages . के लिए (मैनुअल में पिछला आइटम)।
अमान्य परीक्षण
दूसरे, विचार करें कि एक पंक्ति अभिव्यक्ति का मूल्यांकन कैसे किया जाता है। एक परीक्षण row_variable IS NULL रिटर्न TRUE अगर (और केवल अगर) हर एक तत्व है NULL . निम्नलिखित उदाहरण को देखते हुए:
SELECT (1, NULL) IS NULL AS a -- FALSE
,(1, NULL) IS NOT NULL AS b -- also FALSE
दोनों भाव वापसी FALSE . दूसरे शब्दों में, एक पंक्ति (या रिकॉर्ड) चर (1, NULL) न तो NULL है , न ही यह NOT NULL . है . इसलिए, आपके दोनों परीक्षण विफल हो जाते हैं।
-> SQLfiddle अधिक विवरण के साथ।
CHECK . में इस व्यवहार के लिए अधिक विवरण, स्पष्टीकरण, लिंक और संभावित अनुप्रयोग इस संबंधित उत्तर में बाधा:
स्तंभों के एक सेट पर पूर्ण बाधा नहीं
आप NULL के साथ एक रिकॉर्ड वैरिएबल भी असाइन कर सकते हैं (rec := NULL ), जिसके परिणामस्वरूप प्रत्येक तत्व NULL होता है - यदि प्रकार एक प्रसिद्ध पंक्ति प्रकार है। अन्यथा, हम एक अनाम रिकॉर्ड के साथ काम कर रहे हैं और संरचना अपरिभाषित है और आप शुरू में तत्वों तक नहीं पहुंच सकते हैं। लेकिन rowtype . के साथ ऐसा नहीं है जैसे आपके उदाहरण में (जो हमेशा प्रसिद्ध है)।
समाधान:FOUND
<ब्लॉकक्वॉट>
यदि आपको SELECT * INTO . से कोई पंक्ति प्राप्त हुई है, तो परीक्षण करने का सही तरीका क्या है? ?
आपको यह विचार करना होगा कि पंक्ति NULL हो सकती है, भले ही उसे असाइन किया गया हो। क्वेरी बहुत अच्छी तरह से NULL मानों का एक गुच्छा लौटा सकती है (यदि आपकी क्वेरी में तालिका परिभाषा NULL मानों की अनुमति देती है)। ऐसा परीक्षण डिज़ाइन द्वारा अविश्वसनीय होगा।
एक सरल और सुरक्षित तरीका है। उपयोग GET DIAGNOSTICS ... या (जहां लागू हो) विशेष चर FOUND :
SELECT * FROM my_table WHERE owner_id = 6 INTO my_var;
IF NOT FOUND THEN
RAISE NOTICE 'Query did not return a row!';
END IF;
मैनुअल में विवरण।