2014년 1월 15일

자바에서 Oracle TIMESTAMP 타입 사용하기

데이터의 생성일 또는 수정일을 표한하기 위하여 Oracle 의 DATE형을 사용하였다. 이경우 문제는 시간값이 저장되지 않는 문제가 있다. V2_ANNOUNCE 데이블이 있다. 기본적으로 시간값을 입력하지 않으면 SYSDATE 명령을 사용하여 디폴드 값이 입력되도록 하였다. SYSDATE 에 의하여 저장되는 값은 시간정보가 포함된다. 그러나 자바에서 java.util.Date 값을 인자로하여 데이터를 저장하면 시간값이 입력되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE V2_ANNOUNCE (
 ANNOUNCE_ID    INTEGER NOT NULL,
 OBJECT_TYPE      INTEGER NOT NULL,
 OBJECT_ID       INTEGER NOT NULL,   
 USER_ID        INTEGER NOT NULL,   
 SUBJECT        VARCHAR2(255) NOT NULL,
 BODY        VARCHAR2(255) NOT NULL,
 START_DATE      DATE DEFAULT  SYSDATE NOT NULL,
 END_DATE       DATE DEFAULT  SYSDATE NOT NULL,
 STATUS        NUMBER(1, 0)  DEFAULT 0,
 CREATION_DATE     DATE DEFAULT  SYSDATE NOT NULL,
 MODIFIED_DATE     DATE DEFAULT  SYSDATE NOT NULL,
 CONSTRAINT V2_ANNOUNCE_PK PRIMARY KEY (ANNOUNCE_ID)
);
Oracle 에서 DATE 형은 (7바이트로 년, 월, 일, 시, 분, 초을 표현) 날짜와 시간 값 모두를 저장할 수 있지만, 디폴드로 날짜만 저장되도록 설정되어 있다.
1
select * from nls_session_parameters where parameter = 'NLS_DATE_FORMAT' ;
을 실행하면 값이 "RR/MM/DD" 즉 년/월/일 형식으로 설정되어 있음을 알 수 있다. DATE 형에서 시간값 저장이 가능하도록 아래와 같이 변경하여야 한다.
1
alter nls_session_parameters set NLS_DATE_FORMAT =  "RR/MM/DD ㅗㅗ24:MI:SS" ;
이는 현재 세션에만 적용된다. DATE 형의 확장형인 TIMESTAMP 형은 기본적으로 시간 값이 저장된다. 따라서 시간 값 입력이 필요한 경우는 TIMESTAMP 형을 사용한다. TIMESTAMP 의 디폴드 값은 SYSTIMESTAMP 명령을 사용하면 된다. 자바 코드에서는 다름과 같이 사용하면 된다. (예시는 SPRINGFRAMEWORK 기반)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/** Mapper 을 사용하여 값을 DB에서 꺼내는 예시 **/
 private final RowMapper<announce> announceMapper = new RowMapper<announce>(){
  public Announce mapRow(ResultSet rs, int rowNum) throws SQLException {
   AnnounceImpl announce = new AnnounceImpl();
   announce.setAnnounceId(rs.getLong("ANNOUNCE_ID"));
   announce.setObjectType(rs.getInt("OBJECT_TYPE"));
   announce.setObjectId(rs.getLong("OBJECT_ID"));
   announce.setUserId(rs.getLong("USER_ID"));
   announce.setSubject(rs.getString("SUBJECT"));
   announce.setBody(rs.getString("BODY"));
   announce.setStartDate(rs.getTimestamp("START_DATE"));
   announce.setEndDate(rs.getTimestamp("END_DATE")); 
   announce.setCreationDate(rs.getDate("CREATION_DATE"));
   announce.setModifiedDate(rs.getDate("MODIFIED_DATE"));    
   return announce;
  
 };
</announce></announce>
1
2
3
4
5
6
7
8
9
/** 값을 DB에서 저장하는 예시 **/
  getJdbcTemplate().update("insert sql statement ..."
  new SqlParameterValue (Types.NUMERIC, announce.getAnnounceId()),
  new SqlParameterValue (Types.VARCHAR, announce.getSubject()),
  new SqlParameterValue (Types.VARCHAR, announce.getBody() ),
  new SqlParameterValue(Types.TIMESTAMP, announce.getStartDate()),
  new SqlParameterValue(Types.TIMESTAMP, announce.getEndDate()),
  new SqlParameterValue(Types.DATE, announce.getCreationDate()),
  new SqlParameterValue(Types.DATE, announce.getModifiedDate()) );  

댓글 없음:

댓글 쓰기