2014-09-07 2 views
0

내 Java 응용 프로그램을 통해 행이 이미 존재하지 않으면 두 열 테이블 PRODUCTS_CAT에 행을 삽입하려고합니다. 행은 xml 대기열에서 읽습니다.PostgeSQL 존재하지 않는 경우 여러 행 삽입

이것은 대기열을 가져 오는 방법입니다.

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

내가 잘못했을 수도 있지만 입력 한 코드에 _ 행이 표시되지 않습니다. – Volune

+0

나는 당신이 의미하는 바를 잘 이해하지 못했습니다. 행은 xml 파일 형식의 대기열에서 읽습니다. 그것도 포함시켜야합니까? – TheEYL

+0

나는 이것을 이해했다 :'prod'는 한 행의 데이터를 포함하고, 여러분이 제공 한 코드는 한 행에 한 번 여러 번 호출된다. 내가 옳다면 코드가 실제로 여러 번 호출되는지 확실합니까? 내가 틀렸다면 모든 행을 포함하는 클래스를 보여줄 수 있습니까? – Volune

답변

2

(SELECT (?,NULL) FROM 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()); 
+0

예 Id가 이미 존재하는지 테스트하지만 동일한 행과 다른 행을 다시 삽입하려고하면 오류가 반환되고 다른 행은 삽입되지 않습니다. – TheEYL

+0

@Leyonce 어떤 오류가 있습니까? – Volune

+0

org.postgresql.util.PSQLException : 오류 : 중복 키 값이 고유 제한 조건을 위반 함 "products_cat_pkey" 세부 정보 : Key (product) = (138)이 이미 있습니다. – TheEYL

관련 문제