[pgsql] with 구문인 경우 컬럼수만 맞추어 주면 되지 않나요? 0 3 5,640

by ampwings [2016.08.22 20:09:34]


mybatis에서 아래처럼 작성하였는데
( ERROR: syntax error at or near "UPDATESET" )
자바에서 이와 같은 에러가 나오네요.
    <insert id ="excel_cartUSA" parameterType ="java.util.List" >
    <foreach collection ="list" item ="element" index ="index" >
               WITH tempSelect (country, b_Name, partNum, description, qty, id, vinNum, memo)
               AS
               (
                  SELECT country, b_name, partNum, description, #{element.qty} AS qty, #{element.id} AS id, #{element.vinNum} AS vinNum, #{element.memo} AS memo FROM vParts_All
                  WHERE (partNum=#{element.partNum} AND country='USA')
               )
               INSERT INTO cart(country, b_Name, partNum, description, qty, id, vinNum, memo)
               SELECT * FROM tempSelect ON CONFLICT(partNum) DO UPDATE SET qty=#{element.qty} vinNum=#{element.vinNum}, memo=#{element.memo}
              
     foreach >
     insert >
 
INSERT 하는데 문제가 발생되나 (?) 해서 아래처럼 UPSERT문으로 바꾸었더니 
          <insert id ="excel_cartUSA" parameterType ="java.util.List" >
    <foreach collection ="list" item ="element" index ="index" >
               WITH tempSelect (country, b_Name, partNum, description, qty, id, vinNum, memo)
               AS
               (
                  SELECT country, b_name, partNum, description, #{element.qty} AS qty, #{element.id} AS id, #{element.vinNum} AS vinNum, #{element.memo} AS memo FROM vParts_All
                  WHERE (partNum=#{element.partNum} AND country='USA')
               )
               ,upsert AS
               (
                  UPDATE cart SET qty=#{element.qty}, vinNum=#{element.vinNum}, memo=#{element.memo} WHERE partNum=#{element.partNum} RETURNING *
               )
               INSERT INTO cart (country, b_Name, partNum, description, qty, id, vinNum, memo)
               SELECT * FROM tempSelect WHERE NOT EXISTS (SELECT * FROM upsert)
              
         foreach >
          insert >
 
 
 
(ERROR: syntax error at or near "WITH")
이런 에러가 또 나옵니다. 
 
뭐가 문제일까요? 
by 마농 [2016.08.23 09:36:10]

mybatis 에서 바로 SQL 을 작성하지 마시고
SQL 만 따로 실행해서 잘 돌아가는지 우선 확인하셔야 할 듯 합니다.
mybatis 는 안 써봐서 잘 모르겠고...
SQL 구문도 조금 생소한 구문이 보이네요. 오라클이 아닌 듯?
SQL 구문오류는 mybatis 가 아닌 SQL 실행창에서 잡으세요.


참고로...
오라클의 경우 WITH 문의 위치는 Select 절 앞에 위치합니다.
Insert 문 앞에 쓰면 오류납니다.
WITH 문의 위치를 옮겨보세요.


by ampwings [2016.08.23 13:35:12]

답변주셔서 감사합니다.

pgsql 에서 발생되는 문제들입니다.  

 

말씀하신대로 각각 sql문만 심플한 예제로 다시 해보니까 

INSERT INTO t1(no,partNum) values(11, '5678') ON CONFLICT(no) DO UPDATE SET qty=3;

ON CONFLICT(no) 에서 보면 해당컬럼(no) 가 unique 이어야만 실행이 되더라구요. 

이때 unique가 아닐때 실행할 수 있는 방법이 있을까요? 

 

두번째로 

WITH tempSelect (no, partNum, qty)
AS
(
SELECT no, '111' AS partNum, 999 AS qty FROM t2
WHERE no=3
)
, upsert AS
(
UPDATE t1 SET qty=333 WHERE no=111 RETURNING *
)
INSERT INTO t1 (no, partNum, qty)
SELECT * FROM tempSelect WHERE NOT EXISTS(SELECT * FROM upsert)
;

이렇게 하면 문제없이 작동하는데 

 

mybatis 에서 원래 코드를 입력해서 보면  

    <insert id="excel_cartUSA" parameterType="java.util.List">
    <foreach collection="list" item="element" index="index" >

WITH tempSelect (country, b_Name, partNum, description, qty, id, vinNum, memo)
AS
(
SELECT country, b_name, partNum, description, #{element.qty} AS qty, #{element.id} AS id, #{element.vinNum} AS vinNum, #{element.memo} AS memo FROM vParts_All
WHERE partNum=#{element.partNum} AND country='USA'
)
,upsert AS
(
UPDATE cart SET qty=#{element.qty}, vinNum=#{element.vinNum}, memo=#{element.memo} WHERE partNum=#{element.partNum} AND id=#{element.id} RETURNING *
)
INSERT INTO cart (country, b_Name, partNum, description, qty, id, vinNum, memo)
SELECT * FROM tempSelect WHERE NOT EXISTS (SELECT * FROM upsert)

    </foreach>
    </insert>

 

syntax error at or near "WITH" 에러가 뜨네요. 

mybatis 에서 foreach 때문인가 싶기도 하고 ... 알수가 없네요.. 


by ampwings [2016.08.24 09:55:08]

두번째 경우는 

foreach 구문을 쓰면서 

를 입력하지 않아서 발생하는 문제였네요. 

잘 해결되었습니다 .. ^^ 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입