0

如何从 pqxx 调用重载的远程过程?

程序例如:

CREATE OR REPLACE FUNCTION foo(str text) RETURNS text AS $$
BEGIN    
    RETURN 'text';
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION foo(num integer) RETURNS text AS $$
BEGIN    
    RETURN 'int';
END;
$$ LANGUAGE plpgsql;

C++ 代码:

pqxx::connection connection(/* credentials */);

std::string query_mark = "test_procedure_mark";
connection.prepare(query_mark, "SELECT foo($1);");

//first case
pqxx::work work(connection);
pqxx::result res = work.prepared(query_mark)("text").exec();
work.commit();
std::string ans = res[0][0].as(std::string(""));  //ans here "text"

//second case
pqxx::work work(connection);
pqxx::result res = work.prepared(query_mark)(1).exec();
work.commit();
std::string ans = res[0][0].as(std::string("")); //ans here "text"

如何从 C++ 代码中调用“foo(num integer)”?例如,“ans”中的所需结果“int”。

psql.exe 输出:

选择 foo(1); 返回“int”

选择 foo("测试"); 返回“文本”

提前致谢。

4

1 回答 1

2

我不认为你可以用一个准备好的语句来解决它。

您可以在 libpqxx 3.1 中设置每个参数的处理方式(参见第三个示例),例如:

connection.prepare(query_mark_text, "SELECT foo($1);")("text", pqxx::prepare::treat_string);
connection.prepare(query_mark_int,  "SELECT foo($1);")("integer");

但我在最新的文档中看不到这一点。

或者,您可以将参数转换为 PostgreSQL 方面所需的类型,使用:

connection.prepare(query_mark_text, "SELECT foo($1::text);");
connection.prepare(query_mark_int,  "SELECT foo($1::int);");
于 2014-08-22T13:55:39.573 回答