c++ - 谁能让我知道如何使用 pqxx 库在 c++ 中调用 postgres db 函数和过程?
问题描述
我正在使用 C++ 数据库应用程序,我们希望将 oracle 迁移到 Postgre,因此需要帮助来调用 Postgre db function & procedure。我正在使用 pqxx 库与数据库连接和事务数据。使用 pqxx 库我能够将数据连接并插入和更新到数据库中,但无法在我的 C++ 代码中调用 db 函数和过程。谁能帮我解决这个问题?
我有一个示例函数-> ec_special_item$bhutan_getitem
下面开始的代码->
CREATE OR REPLACE FUNCTION public."ec_special_item$bhutan_getitem"(
INOUT ai_presentingbank text,
ai_bankroutingnum integer,
OUT ao_numerrorid integer,
OUT ao_strerrordesc text,
OUT ao_item_state text)
RETURNS record
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
BEGIN
ai_presentingbank:='12345678';
INSERT INTO public.Tyre(item_type_code, description)VALUES (ai_bankroutingnum, 'outward');
SELECT
UPPER(description) AS Tyre into ao_item_state
FROM public.Tyre
WHERE LOWER(description) = 'inward'
;
ao_numerrorid := 50;
ao_strerrordesc := 'PASS';
RETURN ;
EXCEPTION
WHEN others THEN
ao_numerrorid := 0;
ao_strerrordesc := 'FAIL';
RETURN ;
END;
$BODY$;
解决方案
如果该过程有任何输出参数,则将返回一个结果行,其中包含这些参数的值。
因此,您应该将CALL
表达式视为 aSELECT
并处理单个结果行。
如果您调整快速示例,它应该类似于:
pqxx::work txn{c};
pqxx::result r{txn.exec("CALL ec_special_item$bhutan_getitem('some_bank', 12345)"};
for (auto row: r)
std::cout
<< "\nai_presentingbank: " << row["ai_presentingbank"].c_str()
<< "\nao_numerrorid: " << row["ao_numerrorid"].as<int>()
<< "\nao_strerrordesc: " << row["ao_strerrordesc"].c_str()
<< "\nao_item_state: " << row["ao_item_state"].c_str()
<< std::endl;
}
txn.commit();
推荐阅读
- python - 最佳解决方案的建议 - Python
- javascript - 使用 Jest 测试 Redux 和 Axios 获取中间件
- docker - 从 localhost 的另一个容器内的容器访问 docker 端口
- html - 如何在输入标签中将文本移动到更高的位置并在到达结束行时输入?
- oracle - sysdate() 导致 Postgres 忽略索引并进行昂贵的顺序扫描
- python - 在熊猫的列上滚动分位数
- ssl - 不要在端点子集 IP 前添加 http://
- android - 如何使 ScrollTo 滚动到相同的 y
- ruby-on-rails - rails Action Mailer perform_deliveries=false 不工作
- ms-word - 从 Word 文档生成 .hhk 文件