2014년 1월 15일

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

데이터의 생성일 또는 수정일을 표한하기 위하여 Oracle 의 DATE형을 사용하였다. 이경우 문제는 시간값이 저장되지 않는 문제가 있다. V2_ANNOUNCE 데이블이 있다. 기본적으로 시간값을 입력하지 않으면 SYSDATE 명령을 사용하여 디폴드 값이 입력되도록 하였다. SYSDATE 에 의하여 저장되는 값은 시간정보가 포함된다. 그러나 자바에서 java.util.Date 값을 인자로하여 데이터를 저장하면 시간값이 입력되지 않는다.
  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바이트로 년, 월, 일, 시, 분, 초을 표현) 날짜와 시간 값 모두를 저장할 수 있지만, 디폴드로 날짜만 저장되도록 설정되어 있다.
select * from nls_session_parameters where parameter = 'NLS_DATE_FORMAT' ;
을 실행하면 값이 "RR/MM/DD" 즉 년/월/일 형식으로 설정되어 있음을 알 수 있다. DATE 형에서 시간값 저장이 가능하도록 아래와 같이 변경하여야 한다.
alter nls_session_parameters set NLS_DATE_FORMAT =  "RR/MM/DD ㅗㅗ24:MI:SS" ;
이는 현재 세션에만 적용된다. DATE 형의 확장형인 TIMESTAMP 형은 기본적으로 시간 값이 저장된다. 따라서 시간 값 입력이 필요한 경우는 TIMESTAMP 형을 사용한다. TIMESTAMP 의 디폴드 값은 SYSTIMESTAMP 명령을 사용하면 된다. 자바 코드에서는 다름과 같이 사용하면 된다. (예시는 SPRINGFRAMEWORK 기반)
        
/** Mapper 을 사용하여 값을 DB에서 꺼내는 예시 **/
 private final RowMapper announceMapper = new RowMapper(){
  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;
  }  
 }; 
        

/** 값을 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()) );   

댓글 없음:

댓글 쓰기