설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


총 게시물 188건, 최근 1 건
   

INSERT절 안의 SELET절 관련 질문

글쓴이 : 초보 날짜 : 2016-07-11 (월) 16:48 조회 : 7862
안녕하세요 하기코드 SELECT절에서 에러가 발생하여 질문드립니다.


INSERT INTO COUPON_USER_LIST (REAL_NUM)
SELECT (a.MAX_NUM + ROWNUM) AS REAL_MAX_NUM
FROM
(
SELECT MAX(NUM) AS MAX_NUM
FROM COUPON_USER_LIST
)a;

여기서 2번째줄 '+' 부분에서 에러 발생하였는데 어떻게 수정해야할지 모르겠습니다..

저 두개의 값을 더하여야하는데 방법이 있을까요..?

(+추가질문)
또한 EDB*Loader에서 컨트롤파일 내에 Oracle 시퀀스함수와 같은 기능을가진 함수는 없나요..?

최대한 답변부탁드립니다. 감사합니다~*^^*

주킹 2016-07-11 (월) 17:10
해당 컬럼의 type이 어찌되는지요..?
그리고 error명도 같이 보여주셔야 알려드릴수가 있습니다.
(간단히 test시에는 문제가 없습니다..쿼리상)

추가질문은 어떠한 부분인지 오라클에서 사용하시는 방법을 알려주시면 가이드 가능하겠습니다.
댓글주소
초보 2016-07-11 (월) 17:39
댓글달린 게시물은 수정불가하여 댓글에 남깁니다!

원래 실행해야 할 쿼리는 이러합니다.

INSERT INTO USER_LIST (SERIAL_NUM, ID, PHONE_NUM, CON)
SELECT (b.MAX_SERIAL_NUM + ROWNUM) AS SERIAL_NUM, '20000200020008000001' AS ID,a.PHONE_NUM AS PHONE_NUM, a.CON AS CON
FROM
(
SELECT PHONE_NUM, CON, ROWNUM
FROM PHONE_LIST
) a,
(
SELECT MAX(SERIAL_NUM) AS MAX_SERIAL_NUM
FROM USER_LIST
)b;

여기서 PHONE_LIST 테이블에는 PHONE_NUM와 CON데이터가 삽입되어 있습니다.

타입은 각각 순서대로 말하자면
SERIAL_NUM  character(15) not null
ID  character(15) not null
PHONE_NUM  character(11) not null
CON character(20) not null                입니다.

+만의 문제가 아니라 조인과 +를 같이사용하는 방식에서 틀린 것 같은데 방법을 모르겠네요..

도와주시면 감사하겠습니다!
댓글주소
초보 2016-07-11 (월) 17:42
그리고 에러코드는 이러합니다!
ERROR:  operator does not exist: text + bigint
LINE 2: SELECT (b.MAX_COUPON_SERIAL_NUM + ROWNUM) AS COUPON_SERIAL_N...
                                        ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
********** Error **********

ERROR: operator does not exist: text + bigint
SQL state: 42883
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Character: 164

참고사항으로
(b.MAX_SERIAL_NUM + ROWNUM) 이부분의 에러만 고치면 정상적으로 insert 됩니다..ㅜㅠ
댓글주소
주킹 2016-07-11 (월) 17:47
AX_SERIAL_NUM  -> text 네요

oracle은 자동 형변환이 되지만 postgresql은 자동 형변환 안됩니다.

::numeric  형태로 type casting을 해주셔야합니다.
댓글주소
주킹 2016-07-11 (월) 17:47
굳이 text형태의 컬럼으로 하실 필요가 없다면 설계 면에서 type을 변환하는 것도 좋습니다.
댓글주소
초보 2016-07-11 (월) 18:03
(b.MAX_SERIAL_NUM + ROWNUM) AS SERIAL_NUM  쿼리를 주킹님말씀데로
(b.MAX_SERIAL_NUM::numeric + ROWNUM) AS SERIAL_NUM  형변환을 하여 실행했더니 됐습니다!!ㅎㅎ

다만,, 제가원하는 SERIAL_NUM의 데이터값은
000000000000009, 000000000000010 이런식으로 0포함하여 순차적으로 들어가게하고싶은데,
9,10 이런식으로 0을 제외하여 들어가네요.. ㅜㅠ

이것도 방법이 없을까요..?
댓글주소
주킹 2016-07-12 (화) 09:50
select lpad(real_num,13,'0') from coupon_user_list ;

이런식으로 하시면 되고요

google에 검색해보시고 질문하시는게 스스로 발전하시는데 좋습니다.
댓글주소
초보 2016-07-13 (수) 09:13
해결되었습니다. 정말 감사합니다!!!

패팅함수의 존재를 처음알았네요 ㅜㅠ 전 정말 배울게 산더미같이 많은듯싶습니다.. (검색연습도해야겠어요..)

도움주셔서 감사해요~~~ ^^
댓글주소
   

postgresdba.com