database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9701 게시물 읽기
No. 9701
with 구문인 경우 컬럼수만 맞추어 주면 되지 않나요?
작성자
ampwings(ampwings)
작성일
2016-08-23 07:30ⓒ
2016-08-23 09:12ⓜ
조회수
8,216

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 UPDATESET 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")
이런 에러가 또 나옵니다. 

뭐가 문제일까요? 

이 글에 대한 댓글이 총 3건 있습니다.

 updateset 이 아니라 update set입니다...

syntax 에러라고 나온거니 구문부터 확인을 해주시는게 맞습니다.

아래도 syntax 문제이니 구문 확인해보시길 바랍니다.

김주왕(kimjuking)님이 2016-08-23 10:18에 작성한 댓글입니다.

 김주왕님 댓글 주셔서 감사합니다. 

 

각각 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 때문인가 싶기도 하고 ... 알수가 없네요.. 

ampwings(ampwings)님이 2016-08-23 13:41에 작성한 댓글입니다.

systax error at or near "WITH" 에러는 

mybatis 에서 foreach 구문을 쓰면서 

;

를 입력하지 않아서 발생되는 아주 단순한 문제였습니다. 

ampwings(ampwings)님이 2016-08-24 09:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9706pg_rman 설치후 로그 확인 불가상태입니다. [1]
김만영
2016-08-24
7365
9703[pgsql] ON CONFLICT 사용할 때 컬럼이 UNIQUE 가 아닌 경우? [2]
ampwings
2016-08-23
8019
9702AIX 설치시 오류 [1]
NK
2016-08-23
7609
9701with 구문인 경우 컬럼수만 맞추어 주면 되지 않나요? [3]
ampwings
2016-08-23
8216
9700파라미터로 List를 주고 pgsql에서 LOOP문을 이용한 배열 데이터 저장 [5]
ampwings
2016-08-19
15327
9699Postgres logical decoding을 하려고 합니다. [1]
심봉봉
2016-08-18
8182
9696select 문과 upsert문 한번에 처리 방법 [2]
ampwings
2016-08-12
7523
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다