DB 참조

mo_on·2021년 4월 19일
1

DB

목록 보기
1/1
post-thumbnail

Oracle -> PostgreSQL

  1. PostgreSQL 에러코드 참조
  1. 문법 참조

에러 코드 변환 예시

1. bigint = character vaying
주로 jstl 태그에서 형변환 시켜주면 해결 가능
타입이 안맞아서 오류남(조건문 찾아보기)
ex) #{exam}::numeric, ::bigint

2. nvl 함수가 없다
NVL -> COALESCE 로만 변경해주면 해결

3. to_number(bigint) 이름의 함수가 없음
postgreSQL에서는 to_number 함수가 없음. --> 형변환 사용
ex) SELECT COALESCE (MAX ((변수::NUMERIC 또는 ::BIGINT)) + 1, 1)

4. sysdate 없음
now()로 대체
시간 형식도 가져오고 싶으면 TO_CHAR( NOW(), 'YYMMDD')::NUMERIC
ex)insert에 sysdate -> now()로 변경

5. character(8) 자료형에 너무 긴 자료를 담으려고 합니다.
대부분 replace 정규식에서 문제 '-' 빼고 없애버리기, REGEXP도 없애버리기
ex) REGEXP_REPLACE(#{변수, jdbcType=VARCHAR}, '[/\.-]', ''),
--> REPLACE(#{변수, jdbcType=VARCHAR}, '-', '')

6. COALESCE의 타입이 맞지 않다
변환하는 값 뒤에 타입 표시, char를 int로 바꿔서 생기는 문제 였음
ex) COALESCE(#{변수, jdbcType=VARCHAR},0)
--> COALESCE(#{변수}::numeric,0) 와 같이 서로 타입을 맞춰줘야 한다.

7. FROM 절 내의 subquery 에는 반드시 alias 를 가져야만 합니다
서브쿼리 안에 alias를 안해줘서 생김
where절이나 ) 마지막에 별칭 없으면 A, AA 이렇게 붙여줌

8. ROWNUM 이름의 열이 없습니다
postgreSQL에는 ROWNUM이 존재하지 않음

  • select절에서 사용할 때
    SELECT (ROW_NUMBER() OVER()) AS RNUM , {column} FROM {table}
  • where절에서 사용할 때
) A WHERE ROWNUM <= #{lastRecordIndex}
) AA WHERE RNUM > #{firstRecordIndex}

limit #{lastRecordIndex}::numeric
offset #{firstRecordIndex}::numeric

) A  LIMIT #{lastRecordIndex}::numeric
) AA OFFSET #{firstRecordIndex}::numeric

9. 구문 오류, "MERGE" 부근
postgreSQL MERGE INTO 구문 없음(문법 참조)

10. bigint, integer 가 character varying 오류
대부분 숫자/문자열 끼리 형변환 문제
#{jstl, jdbctype=varchar2} 로 되어있는데 컬럼 타입이 숫자인 경우
ex) #{jstl}::numeric 으로 변환.
반대의 경우엔 ::text로 캐스팅 해주기

11. table not exist
테이블이 존재하지 않으므로 oracle/postgreSQL에서 확인해보고 적은 후 메모

12. lpad(character varying, integer, integer) 이름의 함수가 없음
LPAD(char, int, char)로 맞춰줘야 한다.

13. SQL Error [XX000]: 오류: failed to find conversion function from unknown to text
오류 코드가 안뜨지만 형변환문제 ::text, ::numeric을 '숫자', '' 라고 되어있는 곳에 붙여보기.
또는 컬럼의 변수값이 맞지 않는 경우 확인.

형변환 문제. text[또는 다른 타입]이라고 인지할 수 없는 값이 varchar, char와 같은 text 타입에 맞추려고 해서 생기는 문제. 들어가려는 값 != 컬럼의 타입.
주로 ' ', '0' 와 같은 공백/숫자를 텍스트화 하는 것을 인식을 못하는 거 같고,

UNION ALL 을 사용하는 경우에는 결합하려는 쿼리(컬럼)의 값이 서로 달라서 생기는 문제일 가능성이 크다. 가져오려는 컬럼의 타입들을 모두 캐스팅 해서라도 맞춰줘야 한다.

14. Bad value for type BigDecimal
jdbcType=Decimal 일 경우 #{변수,jdbcType=Decimal}::decimal을 붙여준다.
또는 ::numeric을 붙여준다 (해당 테이블에서 컬럼타입 확인하고 맞춰주기) 다른 Type도 마찬가지로 해당 Type 붙여주기

15. the column index out of range
' ' 따옴표가 누락되어있어서 나는 오류였음. 콘솔에 찍힌 마지막 컬럼 주위에 쿼리 오류 없는 지 확인
ex) when '04 <- ' 따옴표 하나 누락

16. 구문 오류, "=" 부근
8번과 같은 오류 where rnum < = 10 수정해주면 해결

limit #{lastRecordIndex}::numeric
offset #{firstRecordIndex}::numeric

17. START WITH 구문 오류
postgreSQL에는 start with 구문이 존재하지 않음
-> WITH AS UNION ALL 구문으로 변경해줘야한다. (링크 참조)

18. DUAL 이 없습니다
postgreSQL에 DUAL이 존재하지않음 --> from dual 없애기

19. TO_CHAR(BIGINT)가 존재하지 않습니다
oracle은 TO_CHAR(INT)가 되는데 POSTGRE는 TO_CHAR(int, text) 이런식으로 들어가야됨
TO_CHAR(원래 값, 'FM999,999, ...') 넣어주기 (링크 참조)
https://lee-mandu.tistory.com/417

20. Substring에는 음수값이 불가합니다.
postgreSQL에서 substr("hello world", ' ', -1) 이런식으로 음수 값을 확인하지 못한다.
Oracle에서 돌아가는 쿼리 결과값을 보고 -1 결과값을 따로 PostgreSQL에서 CASE - WHEN 구문을 이용하여 따로따로 작성해준다.

profile
개발 새발

0개의 댓글