来自未提交的执行的结果,如RETURNING

Results, such as RETURNING, from uncomitted execs?

本文关键字:RETURNING 结果 执行 提交      更新时间:2023-10-16

使用libpqxx,一个准备好的exec s但尚未被commit ted的语句是否可以将结果存储在result中,以便在以后准备的语句中使用?

如果是这样,如何做到这一点?

代码

为了可读性,我把它去掉了,但这基本上就是我想要做的:

void prepare_write_parent_table(connection_base &c){
    try
    {
        c.prepare("write_parent_table", 
            "INSERT INTO parent_table (column_1) "
            "SELECT $1 "
            "RETURNING id"
        )
        ("character", pqxx::prepare::treat_string);
    }
    catch (const exception &e)
    {
        cerr << e.what() << endl;
    }
}
string write_parent_table(transaction_base &t, string data){
    try
    {
        result parent_table_result = t.prepared("write_parent_table")(data).exec();
        return parent_table_result[0][0].c_str();
    }
    catch (const exception &e)
    {
        cerr << e.what() << endl;
        return "";
    }
}
void prepare_write_child_table(connection_base &c){
    try
    {
        c.prepare("write_child_table", 
            "INSERT INTO child_table (parent_table_id, column_a) "
            "SELECT $1, $2 "
        )
        ("character", pqxx::prepare::treat_string)
        ("character", pqxx::prepare::treat_string);
    }
    catch (const exception &e)
    {
        cerr << e.what() << endl;
    }
}

检查来自write_parent_tablereturn以查看if( == "")。如果不是,则继续;否则,我将在那里commit,让它失败,或者如果可能的话,更优选地取消交易;然而,如果可能的话,我还不知道该怎么做。

对于每个CCD_ 10 INSERT,将总是有不确定量的INSERT s进入CCD_ 9。

通过使用数据修改CTE对两个插入使用单个SQL语句来简化操作。这比在客户端中存储中间状态要快得多。

只有当父表中的第一个INSERT成功并返回id:时,才会发生子表中的INSERT

void prepare_write_both_tables(connection_base &c){
    try
    {
       c.prepare("write_both_tables", 
          "WITH p AS ("
             "INSERT INTO parent_table (column_1) "
             "SELECT $1 "
             "RETURNING id) "
          "INSERT INTO child_table (parent_table_id, column_a) "
          "SELECT p.id, $2 "
          "FROM   p"
        )
        ("character", pqxx::prepare::treat_string)
        ("character", pqxx::prepare::treat_string);
    }
    catch (const exception &e)
    {
        cerr << e.what() << endl;
    }
}

搜索[postgres]&quot;数据修改CTE";以获取更多示例
也称为";可写CTE";(或"可写CTE")。

多个子女

对于单个父级和0到多个子级:

void prepare_write_both_tables(connection_base &c){
    try
    {
       c.prepare("write_both_tables", 
          "WITH p AS ("
             "INSERT INTO parent_table (column_1) "
             "SELECT $1 "
             "RETURNING id) "
          "INSERT INTO child_table (parent_table_id, column_a) "
          "SELECT p.id, a "
          "FROM   p, unnest($2::text[]) AS a"
        )
        ("character", pqxx::prepare::treat_string)
        ("character", pqxx::prepare::treat_string);
    }
    catch (const exception &e)
    {
        cerr << e.what() << endl;
    }
}

其中,第二个参数是文本表示中的array of text。示例:

{foo,bar,baz}

这将插入文本数组中元素的行数。对于0个子级,传递NULL或空数组{}