इन पांच विभिन्न प्रकार के डेटा / प्रतीक . की प्रमुख प्रकृति को समझना महत्वपूर्ण है :
<एच4>1.'my_tbl'
अज्ञात . का एक स्ट्रिंग अक्षरशः टाइप करें . जब SQL में उपयोग किया जाता है (plpgsql कोड में एम्बेड किया गया है या नहीं), तो इसे संदर्भ से प्राप्त प्रकार के लिए मजबूर किया जाता है . यदि प्रकार निर्धारित नहीं किया जा सकता है तो एक स्पष्ट कलाकार की आवश्यकता हो सकती है। जैसे:'my_tbl'::text ।
'my_tbl'::text
टाइप करने के लिए एक ही स्ट्रिंग शाब्दिक कास्ट टेक्स्ट . यह एक टेबल का नाम रख सकता है, लेकिन यह वास्तव में सिर्फ टेक्स्ट है।
'my_tbl'::regclass
एक ऑब्जेक्ट आइडेंटिफ़ायर (OID)
एक पंजीकृत वर्ग . के लिए . यह प्रदर्शित होता है और एक वैध ऑब्जेक्ट नाम ('my_tbl' . का प्रतिनिधित्व करने वाली स्ट्रिंग के रूप में इनपुट हो सकता है ) आउटपुट स्वचालित रूप से स्कीमा-योग्य है ('my_schema.my_tbl' ) और / या डबल-उद्धृत ('"mY_TbL"' ) यदि यह अन्यथा अस्पष्ट या अवैध होगा। यह एक नियमित टेबल हो सकता है , अनुक्रम , देखें , भौतिक दृश्य , समग्र प्रकार आदि। इस संबंधित उत्तर में विवरण:
my_tbl_var my_tbl (my_tbl_var my_tbl%ROWTYPE . के लिए संक्षिप्त )
घोषणा में एक plpgsql कोड ब्लॉक का अनुभाग जो एक प्रसिद्ध पंक्ति प्रकार
(ए.के.ए. समग्र प्रकार)। प्रकार को सिस्टम तालिका pg_class . में पंजीकृत किया जाना है (regclass . के समान ही चर)। यह संदर्भित वस्तु का OID नहीं है, बल्कि इसका वास्तविक पंक्ति प्रकार है। my_tbl_var और my_tbl दोनों पहचानकर्ता हैं यहाँ और पैरामीटर नहीं किया जा सकता है। आप किसी भी पंक्ति या रिकॉर्ड को सीधे भी कास्ट कर सकते हैं:(123, 'foo')::my_tbl
5. my_tbl_var रिकॉर्ड
घोषणा में एक plpgsql कोड ब्लॉक का खंड जो एक अनाम रिकॉर्ड
. मूल रूप से, अभी तक अज्ञात पंक्ति प्रकार के लिए एक प्लेसहोल्डर / अभी तक अपरिभाषित संरचना के साथ। इसका उपयोग अधिकांश . में किया जा सकता है स्थानों की एक पंक्ति प्रकार का उपयोग किया जा सकता है। लेकिन रिकॉर्ड वैरिएबल असाइन किए जाने से पहले आप इससे फ़ील्ड एक्सेस नहीं कर सकते।
आप भ्रमित कर रहे थे 1. , 3. और 4. और 5. . का उपयोग करके इसे हल किया इसके बजाय।
लेकिन और भी गलत हो रहा है यहाँ:
-
आप एक संपूर्ण तालिका का चयन कर रहे हैं, लेकिन एक पंक्ति (रिकॉर्ड) चर एक समय में केवल एक पंक्ति को धारण कर सकता है। तो केवल पहला असाइन किया गया है और वापस कर दिया गया है। जबकि कोई
ORDER BYनहीं है खंड, परिणाम मनमाना है और किसी भी समय बदल सकता है। बुराई जाल। -
चूँकि अब आप
रिकॉर्ड. का उपयोग कर रहे हैं टाइप करें, आपको यह सुनिश्चित करने की आवश्यकता है कि इससे पहले कि आप इसके क्षेत्रों पर परीक्षण चला सकें, या आपको खाली तालिकाओं के लिए अपवाद मिलेंगे। आपके मामले में चेकrecord_var IS NULLलगभग एक ही काम करता है। लेकिन सभी क्षेत्रों में NULL वाली पंक्तियों के लिए एक कोने का मामला है:फिरrecord_var IS NULLसत्य का मूल्यांकन करता है। परीक्षण के लिए और भी मुश्किलIS NOT NULL. विवरण यहाँ:मैंने SQL fiddle में एक डेमो जोड़ा है। नीचे।
-
फ़ंक्शन एक एकल अदिश देता है (
बूलियन) मूल्य। उपयोग करें:RETURN false;इसके बजाय:
RETURN QUERY SELECT false;
फ़ंक्शन
CREATE FUNCTION check_valid(_tbl regclass)
RETURNS bool AS
$func$
DECLARE
r record;
_row_ct int;
BEGIN
EXECUTE '
SELECT is_valid, hit_count, hit_limit
FROM ' || _tbl || '
ORDER <whatever>
LIMIT 1' -- replace <whatever> with your sort criteria
INTO r; -- only needed columns
GET DIAGNOSTICS _row_ct = ROW_COUNT;
IF _row_ct = 0 THEN -- necessary, because r may not be assigned
RETURN false;
ELSIF NOT r.is_valid OR r.hit_count > r.hit_limit THEN
RETURN false;
END IF;
RETURN true;
END
$func$ LANGUAGE plpgsql;
SQL Fiddle (फ़ंक्शन के दो प्रकारों और पंक्ति IS NULL के लिए एक डेमो के साथ)।
प्रमुख बिंदु
-
उपयोग करें> यह पता लगाने के लिए कि क्या
EXECUTE. के साथ डायनेमिक स्टेटमेंट में कोई पंक्तियाँ पाई गई हैं । -
आईएफअभिव्यक्ति को सरल बनाया जा सकता है। -
पैरामीटर प्रकार का है
regclass, सिर्फ एक टैबलेटनाम नहीं। मैं इस पैरामीटर के लिए भ्रामक नाम "टेबलनाम" का उपयोग नहीं करूंगा। यह केवल आपके प्रारंभिक भ्रम को जोड़ता है। इसे कॉल करना_tblइसके बजाय।
अगर आप वापसी भी करना चाहते हैं चर पंक्ति प्रकार का एक सेट: