데이터의 생성일 또는 수정일을 표한하기 위하여 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()) );
댓글 없음:
댓글 쓰기