2017-11-17 8 views
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(); 
} 

나는() 여러 쿼리 이전에 커밋 실행하는 방법을 설명하는 this SO-스레드를 읽어 보시기 바랍니다. 따라서 두 번째 delete 문에서 실수를해야하지만 이유를 찾을 수 없습니다.

+0

의 대체 구문을 사용하려고 할 수 있는가? '또한 code' 변수'에 할당을 보여줍니다. – klin

+0

이 질문에 대한 대답은 아니지만 함수의 모든 내용을 래핑하고 함수를 실행할 수 있습니다. 이것은 첫 번째 명령문이 실패한 경우 두 번째 명령을 실행하지 않을 것이라는 추가 이점을 갖게됩니다 (트랜잭션이 동일한 것을 성취 할 수는 있지만). – Hambone

+0

@klin belongsings.code는 테이블의 varchar입니다. 그리고 코드는 'abc', 'def', 'ghi'와 같은 std :: string입니다. 처음 엔 IN 절에 한계가 있다고 생각했지만 그럴 가능성은 낮습니다. – kometen

답변

1

code 매개 변수는 단일 리터럴로 해석됩니다. 당신은 belongings.code`의 유형은 무엇 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