2017-11-17 8 views
2

私は、あるユーザをあるテーブルに更新し、そのユーザに属する別のユーザのデータを削除するトランザクションを作成しています。しかし、最初のクエリだけが実行され、2番目のクエリは実行されません。 2番目のクエリのdeleteステートメントでは、codeはコンマで区切られたstd :: stringです。delete文がpostgresqlで実行されていません

pqxx::connection c(connectionString); 

try { 
    pqxx::work w(c); 
    pqxx::result r; 

    c.prepare("user", "update user set started = null, finished = null, task = $1 where id = $2"); 
    r = w.prepared("user")(task)(email).exec(); 

    c.prepare("belongings", "delete from belongings where id in " \ 
     "(select id from info where code in ($1) and id = $2)"); 
    r = w.prepared("belongings")(code)(id).exec(); 

    w.commit(); 
} 

私はcommit()の前に複数のクエリを実行する方法を説明するthis SOスレッドを読んでいます。だから私は2番目の削除ステートメントで間違いをしている必要がありますが、理由を見つけることができません。

+0

'belongings.codeの種類は何?'またcode'変数 'への割り当てを示しています。 – klin

+0

これはあなたの質問に答えることはできませんが、あなたはそのすべてを関数にラップして関数を実行することができます。これは、最初のステートメントが失敗した場合、2番目のステートメントを実行しない(トランザクションは同じことを達成することができますが)という追加の利点があります。 – Hambone

+0

@klin belongsings.codeは表のvarcharです。コードは 'abc'、 'def'、 'ghi'のようなstd :: stringです。私は最初にIN句に制限があると考えましたが、そうでないようです。 – kometen

答えて

1

codeパラメータは1つのリテラルとして解釈されます。あなたは、例えばany(array expression),の代替構文を使用しようとすることができます。:

code = "{abc,def}";  // instead of code = "'abc','def'" 
... 

c.prepare("belongings", "delete from belongings where id in " \ 
    "(select id from info where code = any ($1) and id = $2)"); 
r = w.prepared("belongings")(code)(id).exec();  
+0

作品。それはとても役に立ちました! – kometen

関連する問題