MERGE INTO 문 질문드립니다 0 5 2,579

by 킹오 [Oracle 기초] [2020.07.27 09:33:17]


123.PNG (13,975Bytes)

안녕하세요 MERGE INTO문 안에서 INSERT 시 SELECT로 조회한 값을 넣고자 하는데 에러가 나서 질문드립니다 쿼리는 사진과 같은 구조를 가지고 있으며 INSERT시 SELECT하는 하여 넣는 값은, BTABLE의 값들과, 파라미터들입니다 SELECT를 하지 않고 단순히 파라미터들만 넣으면 에러가 나지 않는데요 저렇게 했을 시 에러가 왜 나는지 모르겠습니다. INSERT 시 SEELCT를 하려면 VALUES를 빼야한다는 말을 듣고 빼 보았으나 VALUES가 없다는 에러가 납니다 발생한 오류는 이 오류입니다. ORA-00926: 누락된 VALUES 키워드 감사합니다 .
by 킹오 [2020.07.27 09:34:32]

회사 소스를 올려 지우느라 컬럼이 잘못되었을 수도 있는데 문법 위주로 봐주심녀 감사하겠습니다 ㅠㅠ 


by 우리집아찌 [2020.07.27 10:51:28]

INSERT 문이 좀 이상합니다.

테이블을 읽어서 INSERT 하려면 

-- 이런식으로 사용됩니다.

INSERT INTO ..

( SELECT * FROM ... )

 

그리고 MERGE 문 사용할만한 구문이 형식이 아닌데요.


by 킹오 [2020.07.27 11:11:32]

INTO는 위 MERGE 부분에 있어 사용하지 않았습니다

 

문법을 다시 찾아보니 SELECT 하는 부분을 위 USING 안에 넣어야 한다고 하니 다시 해보겠습니다 


by 마농 [2020.07.27 13:08:23]

USING 절에 dual 대신 SELECT 절을 넣는 방법이 있습니다만.
다만 올려주신 쿼리는 이상합니다.
btable 을 Select 하는 것이 불필요해 보이네요.
 

-- 1. Using 절에서 Select 하기. 단, btable 필요 없음.
MERGE INTO atable a
USING (SELECT ASeq.NEXTVAL seq
            , #{NAME}      name
            , #{id}        id
            , #{password}  password
            , TO_CHAR(sysdate, 'yyyymmddhh24miss') day
         FROM dual
       ) b
ON (a.seq = b.seq)
WHEN MATCHED THEN
  UPDATE
     SET name = b.name
       , day  = b.day
WHEN NOT MATCHED THEN
  INSERT (  seq,   name,   id,   password,   day)
  VALUES (b.seq, b.name, b.id, b.password, b.day)
;
-- 2. Select 필요 없음.
MERGE INTO atable
USING dual
ON (seq = #{Seq})
WHEN MATCHED THEN
  UPDATE
     SET name = #{NAME}
       , day = TO_CHAR(sysdate, 'yyyymmddhh24miss')
WHEN NOT MATCHED THEN
  INSERT ( seq, name, id, password, day )
  VALUES ( ASeq.NEXTVAL
         , #{NAME}, #{id}, #{password}
         , TO_CHAR(sysdate, 'yyyymmddhh24miss')
         )
;

 


by 킹오 [2020.07.27 19:17:22]

헉 2가지 방법이 다 가능했네요 .. 배워갑니다 감사합니다. 

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