sql >> Database >  >> RDS >> PostgreSQL

Verklaringen voorbereiden en parameters binden in Postgresql voor C++

Een eenvoudig voorbeeld. Dit drukt gewoon het aantal inzendingen af ​​met id-waarde 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;
}

De functie w.prepared() is een beetje ingewikkeld. Het is vergelijkbaar met een curried (curry) -functie in haskell, omdat het een parameter nodig heeft en een andere functie retourneert die op zijn beurt een andere parameter nodig heeft. Dat soort dingen.

Documentatie zegt:

Hoe geef je die parameters door? C++ heeft geen goede manier om je een onbeperkt, variabel aantal argumenten door te geven aan een functieaanroep, en de compiler weet niet hoeveel je er gaat doorgeven. Daar is een trucje voor:je kunt de waarde die je terugkrijgt van prepare behandelen als een functie, die je aanroept om een ​​parameter door te geven. Wat je terugkrijgt van die aanroep is weer hetzelfde, dus je kunt het opnieuw aanroepen om een ​​andere parameter door te geven enzovoort.

Zodra u alle parameters op deze manier hebt doorgegeven, roept u de instructie met de parameters op door exec op de aanroep aan te roepen

Als er meer parameters zijn, gebruik dan $1 $2 enzovoort in de prepare functie.

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

en geef de variabelen als

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

Een voorbeeld voor dynamische voorbereiding

#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;
}

als u andere gegevenstypen wilt verwerken, gebruik dan deze functiedefinitie

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. Hoe DATE_ADD() werkt in MariaDB

  2. Hoe te SELECTEREN UIT opgeslagen procedure

  3. Hoe NIET RLIKE werkt in MariaDB

  4. Libreoffice installeren op Ubuntu 16.04