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

C++ के लिए Postgresql में स्टेटमेंट और बाइंड पैरामीटर कैसे तैयार करें?

एक साधारण उदाहरण। यह सिर्फ आईडी मान 0 के साथ प्रविष्टियों की संख्या प्रिंट करता है।

#include<pqxx/pqxx>
#include<iostream>

int main()
{
    std::string name = "name";
    int id = 0;
    try {
        //established connection to data base
        pqxx::connection c("dbname=mydb user=keutoi");
        pqxx::work w(c);
        //statement template
        c.prepare("example", "SELECT id  FROM mytable WHERE id = $1");
        //invocation as in varible binding
        pqxx::result r = w.prepared("example")(id).exec();
        
        w.commit();
        //result handling for accessing arrays and conversions look at docs
        std::cout << r.size() << std::endl;
    }
    catch(const std::exception &e)
    {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

फ़ंक्शन w.prepared() थोड़ा जटिल है। यह हैकेल में एक करीबी (करी) फ़ंक्शन के समान है, क्योंकि इसमें एक पैरामीटर लेता है और दूसरा फ़ंक्शन देता है जो बदले में एक और पैरामीटर लेता है। उस तरह की बात।

दस्तावेज़ीकरण कहता है:

<ब्लॉकक्वॉट>

आप उन मापदंडों को कैसे पास करते हैं? सी ++ के पास फ़ंक्शन कॉल में असीमित, परिवर्तनीय संख्या तर्कों को पारित करने का कोई अच्छा तरीका नहीं है, और संकलक यह नहीं जानता कि आप कितने पास करने जा रहे हैं। इसके लिए एक तरकीब है:आप एक फ़ंक्शन के रूप में तैयार किए गए मान का इलाज कर सकते हैं, जिसे आप एक पैरामीटर पास करने के लिए कहते हैं। उस कॉल से आपको जो वापस मिलता है वह फिर से वही होता है, इसलिए आप इसे फिर से कॉल कर सकते हैं और एक और पैरामीटर पास कर सकते हैं।

एक बार जब आप इस तरह से सभी पैरामीटर पास कर लेते हैं, तो आप कॉल करके पैरामीटर के साथ स्टेटमेंट को इनवोकेशन पर कॉल कर सकते हैं

यदि अधिक पैरामीटर हैं तो $1 $2 का उपयोग करें और इसी तरह prepare . में समारोह।

c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")

और चर को इस रूप में दें

w.prepared("example")(dollar1_var)(dollar2_var).exec()

गतिशील तैयारी के लिए एक उदाहरण

#include<pqxx/pqxx>
#include<iostream>
#include<vector>

//Just give a vector of data you can change the template<int> to any data type
pqxx::prepare::invocation& prep_dynamic(std::vector<int> data, pqxx::prepare::invocation& inv)
{
    for(auto data_val : data)
        inv(data_val);
    return inv;
}

int main()
{
    std::string name = "name";

    //a data array to be used.
    std::vector<int> ids;
    ids.push_back(0);
    ids.push_back(1);

    try {
        pqxx::connection c("dbname=mydb user=keutoi");
        pqxx::work w(c);

        c.prepare("example", "SELECT id  FROM mytable WHERE id = $1 or id = $2");
        pqxx::prepare::invocation w_invocation = w.prepared("example");

        //dynamic array preparation
        prep_dynamic(ids, w_invocation);
        //executing prepared invocation.
        pqxx::result r = w_invocation.exec();

        w.commit();

        std::cout << r.size() << std::endl;
    }
    catch(const std::exception &e)
    {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

यदि आप अन्य डेटा प्रकारों को संभालना चाहते हैं तो इस फ़ंक्शन परिभाषा का उपयोग करें

template<class T> pqxx::prepare::invocation& prep_dynamic(std::vector<T> data, pqxx::prepare::invocation& inv)
{
    for(auto data_val : data)
        inv(data_val);
    return inv;
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC बैच संचालन समझ

  2. अद्यतन विवरण में अनावश्यक डेटा

  3. कैसे Justify_interval () PostgreSQL में काम करता है

  4. बूलियन कॉलम पर SQLAlchemy func.count

  5. मल्टी-डीसी पोस्टग्रेएसक्यूएल:एक वीपीएन पर एक अलग भू-स्थान पर एक स्टैंडबाय नोड सेट करना