package org.beanfuse.db.dialect;
import java.sql.Types;
public class OracleDialect extends AbstractDialect {
public OracleDialect() {
super();
ss = new SequenceSupport();
ss.setQuerySequenceSql("select sequence_name from user_sequences order by sequence_name");
ss.setNextValSql("select {}.nextval from dual");
ss.setSelectNextValSql("{}.nextval");
registerCharacterType();
registerNumericType();
registerDateTimeType();
registerLargeObjectType();
}
protected void registerCharacterType() {
registerColumnType(Types.CHAR, "char(1)");
registerColumnType(Types.VARCHAR, 4000, "varchar2($l)");
registerColumnType(Types.VARCHAR, "long");
registerColumnType(Types.LONGVARCHAR, "long");
}
protected void registerNumericType() {
registerColumnType(Types.BOOLEAN, "number(1,0)");
registerColumnType(Types.BIT, "number(1,0)");
registerColumnType(Types.BIGINT, "number(19,0)");
registerColumnType(Types.SMALLINT, "number(5,0)");
registerColumnType(Types.TINYINT, "number(3,0)");
registerColumnType(Types.INTEGER, "number(10,0)");
registerColumnType(Types.FLOAT, "float");
registerColumnType(Types.DOUBLE, "double precision");
registerColumnType(Types.NUMERIC, "number($p,$s)");
registerColumnType(Types.DECIMAL, "number($p,$s)");
}
protected void registerDateTimeType() {
registerColumnType(Types.DATE, "date");
registerColumnType(Types.TIME, "date");
registerColumnType(Types.TIMESTAMP, "date");
}
protected void registerLargeObjectType() {
registerColumnType(Types.VARBINARY, 2000, "raw($l)");
registerColumnType(Types.VARBINARY, "long raw");
registerColumnType(Types.BLOB, "blob");
registerColumnType(Types.CLOB, "clob");
}
public String getLimitString(String sql, boolean hasOffset) {
sql = sql.trim();
boolean isForUpdate = false;
if (sql.toLowerCase().endsWith(" for update")) {
sql = sql.substring(0, sql.length() - 11);
isForUpdate = true;
}
StringBuffer pagingSelect = new StringBuffer(sql.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 <= ?) where rownum_ > ?");
} else {
pagingSelect.append(" ) where rownum <= ?");
}
if (isForUpdate) {
pagingSelect.append(" for update");
}
return pagingSelect.toString();
}
}