728x90
개발 DB는 mariaDB를 사용하다가 운영 DB는 postgreSQL을 사용해서
변경작업을 하다가 내장함수 관련 오류사항이 발생해 정리해 본다.
< spring 오류 내용 >
Error querying database. Cause: org.postgresql.util.PSQLException: 오류: 연산자 없음: integer = character varying
Cause: org.postgresql.util.PSQLException: 오류: 연산자 없음: integer = character varying
Error 발생원인
: PostgreSQL 8.4 이후 버전부터는 자동으로 타입캐스팅을 해주는 기능이 사라졌다고 한다.
필자는 현재 15.6 버전을 사용 중이다. 그래서 쿼리문에서 DB 데이터 타입과 파라미터 타입을 일치시켜 줘야 했다 !
형변환을 해주는 방법은 아래 예시를 통해 정리하겠다.
타입 통일
CAST( #{param변수} AS DB데이터타입)
-- 기존 코드 mariaDB 버전
WHERE A.EMP_NO = B.EMP_NO
AND DOC_NO = #{docNo}
-- 수정 코드 postgreSQL 버전
-- SELECT문
WHERE A.EMP_NO = B.EMP_NO
AND DOC_NO = CAST(#{docNo} AS INTEGER)
-- INSERT문
INSERT INTO TEST_MANAGEMENT_TBL
( START_DATE
, END_DATE
, USE_DAYS
)
VALUES
( CAST(#{startDate} AS DATE)
, CAST(#{endDate} AS DATE)
, CAST(#{useDays} AS FLOAT)
)
이 외에도 변경적용 부분을 간단히 추가 정리해 본다..
시퀀스 생성 및 사용
: postgreSQL은 NO CACHE는 없고 CACHE 기본값이 1로 설정되어 있다.
-- postgreSQL 시퀀스 생성
CREATE SEQUENCE DOC_NO_seq
START WITH 1
MINVALUE 1
MAXVALUE 9999
INCREMENT BY 1
CACHE 1
NO CYCLE;
또한 쿼리문에서 시퀀스를 사용할 때 ' ' (작은 따옴표)를 넣어서 사용해야 된다.
-- INSERT문에서 사용 예시
INSERT INTO TEST_MANAGEMENT_TBL
( DOC_NO
, DOC_NAME
)
VALUES
( NEXTVAL('DOC_NO_seq')
, #{doc_name}
)
현재 시간 넣기
-- mariaDB
CAN_DATE = sysdate()
-- postgreSQL
CAN_DATE = NOW()
728x90
반응형
'DB' 카테고리의 다른 글
[DB] excel 데이터를 insert문으로 변환하기 (0) | 2024.06.12 |
---|---|
[DB] 클라우드 환경에서 Redis 사용 방법 - session 불일치 해결 방법 (0) | 2024.05.28 |
[DB] SQL Injection 방지를 위한 안전한 쿼리 작성: ${} 대신 Prepared Statements 활용 (0) | 2024.04.25 |
[DB] auto_increment란? (자동 증가 열 생성/추가) (0) | 2024.04.16 |
댓글