arrays - पैराग्राफ के रूप में पोस्टग्रेज़ पूर्णांक एरेज़?




postgresql argument-passing (2)

मैं समझता हूं कि पोस्टग्रेस में शुद्ध, आप फ़ंक्शन में एक पूर्णांक सरणी को पारित कर सकते हैं, लेकिन यह .NET डेटा प्रदाता Npgsql में समर्थित नहीं है।

वर्तमान में मेरे पास एक डीबी कॉमांड है जिसमें मैं एक संग्रहीत प्रक्रिया में एक कॉल लोड करता हूं, एक पैरामीटर में जोड़ता हूं और एक ऑब्जेक्ट को आबाद करने के लिए आईडी वापस करने के लिए स्केलर को निष्पादित करता हूं।

यह अब तर्कों के रूप में एन पूर्णांक लेने की जरूरत है इसका उपयोग बाल रिकॉर्ड बनाने के लिए किया जाता है जिसमें नए बनाए गए रिकॉर्ड को आईडी के द्वारा पूर्णांक तर्क के लिए जोड़ा जाता है।

आदर्श रूप से मेरे पास प्रत्येक पूर्णांक के लिए मेरे डीबी कॉमांड पर एकाधिक ExecuteNonQuery कॉल करने की ज़रूरत नहीं है, इसलिए मैं एक सीएसवी स्ट्रिंग को ऐसे पैरामीटर के रूप में बनाने के लिए कर रहा हूं जो डेटाबेस साइड पर विभाजित होगा।

मैं आम तौर पर LINQ 2 एसक्यूएल में रहते हैं, डीबी एब्स्ट्रक्चर का स्वागत करते हुए मैन्युअल डेटा एक्सेस के साथ इस प्रोजेक्ट पर काम कर रहे हैं, यह सब कुछ सिर्फ गंदा हो रहा है, लोगों को आमतौर पर इन प्रकार के मापदंडों को पोस्टग्रेज में कैसे गुजरना पड़ता है?


मुझे पता है यह एक पुराना सवाल है, लेकिन मुझे एक अच्छा समाधान ढूंढने में कई घंटे लग गए और मैंने सोचा कि मैं यहां क्या सीखा है और किसी और को परेशानी से बचा सकता हूं। कोशिश करो, उदाहरण के लिए,

SELECT * FROM some_table WHERE id_column = ANY(@id_list)

जहां @आईडी_सूची एक int [] पैरामीटर के माध्यम से है

command.Parameters.Add("@id_list", NpgsqlDbType.Array | NpgsqlDbType.Integer).Value = my_id_list;

जहां कमांड एक NpgsqlCommand है (दृश्य स्टूडियो में C # और Npgsql का उपयोग करके)


देखें: http://www.postgresql.org/docs/9.1/static/arrays.html

यदि आपका गैर-देशी ड्रायवर अभी भी आपको एरेज़ पास करने की अनुमति नहीं देता है, तो आप निम्न कर सकते हैं:

  • एक सरणी के स्ट्रिंग का प्रतिनिधित्व करें (जो आपकी संग्रहीत कार्यविधि एक सरणी में पार्स कर सकते हैं - string_to_array देखें)

    CREATE FUNCTION my_method(TEXT) RETURNS VOID AS $$ 
    DECLARE
           ids INT[];
    BEGIN
           ids = string_to_array($1,',');
           ...
    END $$ LANGUAGE plpgsql;

    फिर

    SELECT my_method(:1)

    के साथ: 1 = '1,2,3,4'

  • एक स्ट्रिंग से एक सरणी में डालने के लिए खुद पोस्टग्रे पर भरोसा करते हैं

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;

    फिर

    SELECT my_method('{1,2,3,4}')
  • बांड वैरिएबल का उपयोग न करें और इसके बजाय सभी मापदंडों के साथ एक स्पष्ट आदेश स्ट्रिंग जारी करें (एसक्यूएल इंजेक्शन के हमलों से बचने के लिए बाहर आने वाले सभी पैरामीटर को मान्य या बचाना सुनिश्चित करें।)

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;

    फिर

    SELECT my_method(ARRAY [1,2,3,4])




argument-passing