DB

[postgreSQL] org.postgresql.util.PSQLException: 오류: 연산자 없음 에러 처리하기

콩다영 2024. 4. 30.
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
반응형

댓글