我试图通过我的java应用程序将行插入两列表PRODUCTS_CAT(如果这些行已经存在)。从xml队列中读取行。
这是我获取队列的方法。
public void syncProduct(final ProductInfoExt prod) throws BasicException {
Transaction t = new Transaction(s) {
public Object transact() throws BasicException {
// Sync the Product in a transaction
// Try to update
if (new PreparedSentence(
s,
"UPDATE PRODUCTS SET REFERENCE = ?, CODE = ?, NAME = ?, PRICEBUY = ?, PRICESELL = ?, CATEGORY = ?, TAXCAT = ?, IMAGE = ? WHERE ID = ?",
SerializerWriteParams.INSTANCE).exec(new DataParams() {
public void writeValues() throws BasicException {
setString(1, prod.getReference());
setString(2, prod.getCode());
setString(3, prod.getName());
// setBoolean(x, p.isCom());
// setBoolean(x, p.isScale());
setDouble(4, prod.getPriceBuy());
setDouble(5, prod.getPriceSell());
setString(6, prod.getCategoryID());
setString(7, prod.getTaxCategoryID());
setBytes(8, ImageUtils.writeImage(prod.getImage()));
// setDouble(x, 0.0);
// setDouble(x, 0.0);
setString(9, prod.getID());
}
}) == 0) {
// If not updated, try to insert
new PreparedSentence(
s,
"INSERT INTO PRODUCTS (ID, REFERENCE, CODE, NAME, ISCOM, ISSCALE, PRICEBUY, PRICESELL, CATEGORY, TAXCAT, IMAGE, STOCKCOST, STOCKVOLUME) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
SerializerWriteParams.INSTANCE)
.exec(new DataParams() {
public void writeValues() throws BasicException {
setString(1, prod.getID());
setString(2, prod.getReference());
setString(3, prod.getCode());
setString(4, prod.getName());
setBoolean(5, prod.isCom());
setBoolean(6, prod.isScale());
setDouble(7, prod.getPriceBuy());
setDouble(8, prod.getPriceSell());
setString(9, prod.getCategoryID());
setString(10, prod.getTaxCategoryID());
setBytes(11, ImageUtils.writeImage(prod
.getImage()));
setDouble(12, 0.0);
setDouble(13, 0.0);
}
});
}
/* Insert in catalog */
new StaticSentence(
s,
/*
* leyonce - Insert into the product catalog if the
* products aren't already there
*/
"INSERT INTO PRODUCTS_CAT(PRODUCT,CATORDER) SELECT ?,NULL WHERE NOT EXISTS (SELECT (?,NULL) FROM PRODUCTS_CAT) ",
SerializerWriteString.INSTANCE).exec(prod.getID());
return null;
}
};
t.execute();
}
插入第一行而不插入所有其他行。如果表是空的,它显然会执行插入。
答案 0 :(得分:2)
(SELECT (?,NULL) FROM PRODUCTS_CAT)
中有一行, PRODUCTS_CAT
始终存在(返回一行)。要测试是否已插入此ID,您应该执行以下操作:
SELECT 1 FROM PRODUCTS_CAT WHERE PRODUCT = ?
完整插入声明:
INSERT INTO PRODUCTS_CAT(PRODUCT,CATORDER) SELECT ?,NULL WHERE NOT EXISTS (SELECT 1 FROM PRODUCTS_CAT WHERE PRODUCT = ?)
此外,您需要将ID绑定到每个问号" ?
":
new StaticSentence(
s,
"INSERT INTO PRODUCTS_CAT(PRODUCT,CATORDER) SELECT ?,NULL WHERE NOT EXISTS (SELECT 1 FROM PRODUCTS_CAT WHERE PRODUCT = ?)",
new SerializerWriteBasic(Datas.STRING, Datas.STRING)
).exec(prod.getID(), prod.getID());