Связывание переменных с использованием soci с PL/pgSQL

Я использую библиотеку SOCI для выполнения запросов к базам данных как в базе данных Oracle, так и в базе данных PostgreSQL. Я получил следующее error:

Невозможно выполнить запрос. Фатальная ошибка. ОШИБКА: в сообщении связывания указан 1 параметр, но для подготовленного оператора "" требуется 0 "

Когда я связываю переменную и выполняю следующую PL/pgSQL. Но вариант Oracle работает нормально.

try
{
        // This doesn't work
        std::string sql_pg = " \
                               do $$\n \
                               declare\n \
                               n bigint := 1;\n \
                               begin\n \
                               while n <= :1\n \
                               loop\n \
                               insert into ip_table (ip, user) values('0.0.0.1', 'user1');\n \
                               n := n + 1;\n \
                               end loop;\n \
                               end;\n \
                               $$;";

        // This works
        std::string sql_ora = " \
                               declare\n \
                               n number := 1;\n \
                               sql_statement VARCHAR2(500);\n \
                               begin\n \
                               while n <= :1\n \
                               loop\n \
                               sql_statement := q'[insert into ip_table (ip, user) values('0.0.0.1', 'user1')]';\n \
                               execute immediate sql_statement;\n \
                               n := n + 1;\n \
                               end loop;\n \
                               commit;\n \
                               end;";

        int count=4;
        if (session.get_backend_name() == "postgresql")
                session << sql_pg.c_str(), soci::use(count); // error
        else
                session << sql_ora.c_str(), soci::use(count); // works

        std::cout << "executed successfully" << std::endl;
}
catch(const std::exception& err)
{
        std::cout << err.what() << std::endl;
}

Я пробовал связывать переменные по позиции и по имени. Ничего не работает для скрипта PL/pgSQL. Если я заменяю переменную значением, скрипт работает. Какие-нибудь мысли?

Этот пример не может быть идеальным для вопроса. Но подумай, если я использую if условие с переменной

1 ответ

Вы не можете сделать это в Postgres. DO Команды не допускают внешних параметров. Вы можете применять параметры (внимание на SQL-инъекцию) только на стороне клиента.

Другие вопросы по тегам