Как связать параметры внутри кавычек в подготовленном операторе SQL для libpqxx / C ++ - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть расширенная база данных PostgIS PotgreSQL, и я хотел бы знать, как использовать pqxx::connection_base::prepare для создания оператора SQL с функцией PostGIS, такой как st_distance().

Когда я запрашиваю состояние состояния SQLв PostgreSQL вот так:

database_name=# select st_geomfromtext('POINT(50.0 90.0)', 4326);

Я получаю ответ:

                  st_geomfromtext
----------------------------------------------------
 0101000020E610000000000000000049400000000000805640

Как получить приведенный выше код на libpqxx с C ++?

Я пытался:

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

int main()
{
    try {
        pqxx::connection conn("dbname=xxx user=yyy password=zzz");
        pqxx::work xaction(conn);

        conn.prepare(
            "text to geometry point",
            "select st_geomfromtext('POINT($1 $2)', 4326);"
        );
        pqxx::result selected = xaction.prepared("text to geometry point")(50.0)(90.0).exec();

        for (auto row : selected) {
            for (auto col : row) {
                std::cout << col.c_str() << "\t";
            }
            std::cout << "\n";
        }
        std::cout << std::endl;
        conn.disconnect();
    }
    catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

Но получил ошибку:

ERROR:  bind message supplies 2 parameters, but prepared statement "text to geometry point" requires 0

libpqxx может не выполнить синтаксический анализ 'POINT($1 $2)', поскольку параметры внутри кавычек как текст, поэтому не удалось связать параметр.

Iне имею идеи исправить ошибку.

Это простой пример того, что я хочу сделать.Мне нужно использовать pqxx::connection_base::prepare в реальной работе.

1 Ответ

0 голосов
/ 12 декабря 2018

$1 интерпретируется не как параметр, а как строковый литерал, поскольку он заключен в одинарные кавычки.

Попробуйте

'POINT(' || $1 || ' ' || $2 || ')'
...