Это мой код:
std::unique_ptr<pqxx::connection> conn = connect();
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
try{
conn->prepare("add_pr_file", "select * from add_pr_file($1, $2, $3)");
conn->prepare("entire_add_pr", " select * from entire_add_pr($1, $2, $3, $4, $5)");
pqxx::work tr(*conn.get(), "add_pr");
pqxx::binarystring data((pr.input_data.empty() ? nullptr : (const void *)pr.input_data.data()), pr.input_data.size());
tr.prepared("entire_add_pr")(pr.guid.to_str())(conv.to_bytes(pr.name))(data)(std::to_string(pr.rate))(conv.to_bytes(pr.type));
for (auto file : pr.files) {
tr.prepared("add_pr_file")(pr.guid.to_str())(conv.to_bytes(file.path))(type_cnv::type(file.module)).exec();
}
tr.commit();
}
catch (const pqxx::pqxx_exception &exc) {
THROW(exc.base().what());
}
Я не смог выполнить функцию entire_add_pr
. Эта функция должна добавить одну строку в таблицу pr
. Никаких исключений не происходит, но в результате фиксации в таблице pr
нет строк. Однако оператор add_pr_file
получает результат после фиксации. Это функция entire_add_pr
:
create or replace function entire_add_pr( _guid uuid, _name character varying, _input_data bytea, _rate integer, _type_name character varying )
returns void as $$
begin
insert into pr (guid, name, input_data, rate_priority, pr_type_id) values (_guid, _name, _input_data, _rate, (select id from pr_type where type_name = _type_name));
end;
$$
language plpgsql;
Функция работает хорошо, если я выполняю запрос из командной строки postgresql:
select * from entire_add_pr('1aaa9aaa-aaaa-aaaa-aaaa-aaaaaaaaa111', 'pr_name', '123', 10, 'test type');
entire_add_pr
, например добавляю строкуraise notice '%', unknown_var
, код тоже будет выполняться без исключений, поэтому я прихожу к выводу, что функция plpgsql вообще не выполнялась. - person Ir S   schedule 14.01.2016