Open Source Repository

Home /hibernate/hibernate-3.2.4.ga | Repository Home


org/hibernate/dialect/OracleDialect.java
//$Id: OracleDialect.java 8610 2005-11-18 18:30:27Z steveebersole $
package org.hibernate.dialect;

import java.sql.Types;

import org.hibernate.sql.CaseFragment;
import org.hibernate.sql.DecodeCaseFragment;
import org.hibernate.sql.JoinFragment;
import org.hibernate.sql.OracleJoinFragment;

/**
 * An SQL dialect for Oracle, compatible with Oracle 8.
 @author Gavin King
 */
public class OracleDialect extends Oracle9Dialect {

  public OracleDialect() {
    super();
    // Oracle8 and previous define only a "DATE" type which
    //      is used to represent all aspects of date/time
    registerColumnTypeTypes.TIMESTAMP, "date" );
    registerColumnTypeTypes.CHAR, "char(1)" );
    registerColumnTypeTypes.VARCHAR, 4000"varchar2($l)" );
  }

  public JoinFragment createOuterJoinFragment() {
    return new OracleJoinFragment();
  }
  public CaseFragment createCaseFragment() {
    return new DecodeCaseFragment();
  }

  public String getLimitString(String sql, boolean hasOffset) {

    sql = sql.trim();
    boolean isForUpdate = false;
    if sql.toLowerCase().endsWith(" for update") ) {
      sql = sql.substring0, sql.length()-11 );
      isForUpdate = true;
    }
    
    StringBuffer pagingSelect = new StringBuffersql.length()+100 );
    if (hasOffset) {
      pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
    }
    else {
      pagingSelect.append("select * from ( ");
    }
    pagingSelect.append(sql);
    if (hasOffset) {
      pagingSelect.append(" ) row_ ) where rownum_ <= ? and rownum_ > ?");
    }
    else {
      pagingSelect.append(" ) where rownum <= ?");
    }

    if isForUpdate ) {
      pagingSelect.append" for update" );
    }
    
    return pagingSelect.toString();
  }

  public String getSelectClauseNullString(int sqlType) {
    switch(sqlType) {
      case Types.VARCHAR:
      case Types.CHAR:
        return "to_char(null)";
      case Types.DATE:
      case Types.TIMESTAMP:
      case Types.TIME:
        return "to_date(null)";
      default:
        return "to_number(null)";
    }
  }

  public String getCurrentTimestampSelectString() {
    return "select sysdate from dual";
  }

  public String getCurrentTimestampSQLFunctionName() {
    return "sysdate";
  }
}