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

plpgsql - घोषणा कथन में गतिशील तालिका नाम का उपयोग करना

इन पांच विभिन्न प्रकार के डेटा / प्रतीक . की प्रमुख प्रकृति को समझना महत्वपूर्ण है :

<एच4>1. 'my_tbl'

अज्ञात . का एक स्ट्रिंग अक्षरशः टाइप करें . जब SQL में उपयोग किया जाता है (plpgsql कोड में एम्बेड किया गया है या नहीं), तो इसे संदर्भ से प्राप्त प्रकार के लिए मजबूर किया जाता है . यदि प्रकार निर्धारित नहीं किया जा सकता है तो एक स्पष्ट कलाकार की आवश्यकता हो सकती है। जैसे:'my_tbl'::text

<एच4>2. 'my_tbl'::text

टाइप करने के लिए एक ही स्ट्रिंग शाब्दिक कास्ट टेक्स्ट . यह एक टेबल का नाम रख सकता है, लेकिन यह वास्तव में सिर्फ टेक्स्ट है।

<एच4>3. 'my_tbl'::regclass

एक ऑब्जेक्ट आइडेंटिफ़ायर (OID) एक पंजीकृत वर्ग . के लिए . यह प्रदर्शित होता है और एक वैध ऑब्जेक्ट नाम ('my_tbl' . का प्रतिनिधित्व करने वाली स्ट्रिंग के रूप में इनपुट हो सकता है ) आउटपुट स्वचालित रूप से स्कीमा-योग्य है ('my_schema.my_tbl' ) और / या डबल-उद्धृत ('"mY_TbL"' ) यदि यह अन्यथा अस्पष्ट या अवैध होगा। यह एक नियमित टेबल हो सकता है , अनुक्रम , देखें , भौतिक दृश्य , समग्र प्रकार आदि। इस संबंधित उत्तर में विवरण:

<एच4>4. 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 इसके बजाय।

अगर आप वापसी भी करना चाहते हैं चर पंक्ति प्रकार का एक सेट:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज टेबल पर राशि पढ़ें

  2. PostgreSQL में ग्रेटेस्ट () फ़ंक्शन

  3. हेरोकू, पोस्टग्रेएसक्यूएल, डीजेंगो, टिप्पणियां, स्वादिष्ट:कोई भी ऑपरेटर दिए गए नाम और तर्क प्रकार से मेल नहीं खाता। आपको स्पष्ट प्रकार के कास्ट जोड़ने की आवश्यकता हो सकती है

  4. पोस्टग्रेज क्वेरी में पहली पंक्ति प्राप्त करना

  5. PostgreSQL टेबल पर 150M अपडेट लागू करने का सबसे तेज़ तरीका क्या है