首页 > 解决方案 > 谁能让我知道如何使用 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$;

标签: c++postgresql

解决方案


该命令的 PostgreSQL文档CALL指出:

如果该过程有任何输出参数,则将返回一个结果行,其中包含这些参数的值。

因此,您应该将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();

推荐阅读