001package com.avaje.ebean.config.dbplatform; 002 003import com.avaje.ebean.BackgroundExecutor; 004import com.avaje.ebean.dbmigration.ddlgeneration.platform.Oracle10Ddl; 005 006import javax.sql.DataSource; 007import java.sql.Types; 008 009/** 010 * Oracle10 and greater specific platform. 011 */ 012public class OraclePlatform extends DatabasePlatform { 013 014 public OraclePlatform() { 015 super(); 016 this.name = "oracle"; 017 this.maxTableNameLength = 30; 018 this.maxConstraintNameLength = 30; 019 // OnQueryOnly.CLOSE as a performance optimisation on Oracle 020 this.onQueryOnly = OnQueryOnly.CLOSE; 021 this.dbEncrypt = new OracleDbEncrypt(); 022 this.sqlLimiter = new RownumSqlLimiter(); 023 this.platformDdl = new Oracle10Ddl(this.dbTypeMap, this.dbIdentity); 024 this.historySupport = new OracleDbHistorySupport(); 025 026 // Not using getGeneratedKeys as instead we will 027 // batch load sequences which enables JDBC batch execution 028 dbIdentity.setSupportsGetGeneratedKeys(false); 029 dbIdentity.setIdType(IdType.SEQUENCE); 030 dbIdentity.setSupportsSequence(true); 031 032 this.treatEmptyStringsAsNull = true; 033 034 this.openQuote = "\""; 035 this.closeQuote = "\""; 036 037 booleanDbType = Types.INTEGER; 038 dbTypeMap.put(Types.BOOLEAN, new DbType("number(1) default 0")); 039 040 dbTypeMap.put(Types.INTEGER, new DbType("number", 10)); 041 dbTypeMap.put(Types.BIGINT, new DbType("number", 19)); 042 dbTypeMap.put(Types.REAL, new DbType("number", 19, 4)); 043 dbTypeMap.put(Types.DOUBLE, new DbType("number", 19, 4)); 044 dbTypeMap.put(Types.SMALLINT, new DbType("number", 5)); 045 dbTypeMap.put(Types.TINYINT, new DbType("number", 3)); 046 dbTypeMap.put(Types.DECIMAL, new DbType("number", 38)); 047 048 dbTypeMap.put(Types.VARCHAR, new DbType("varchar2", 255)); 049 050 dbTypeMap.put(Types.LONGVARBINARY, new DbType("blob")); 051 dbTypeMap.put(Types.LONGVARCHAR, new DbType("clob")); 052 dbTypeMap.put(Types.VARBINARY, new DbType("raw", 255)); 053 dbTypeMap.put(Types.BINARY, new DbType("raw", 255)); 054 055 dbTypeMap.put(Types.TIME, new DbType("timestamp")); 056 } 057 058 @Override 059 public IdGenerator createSequenceIdGenerator(BackgroundExecutor be, DataSource ds, String seqName, int batchSize) { 060 061 return new OracleSequenceIdGenerator(be, ds, seqName, batchSize); 062 } 063 064 @Override 065 protected String withForUpdate(String sql) { 066 return sql + " for update"; 067 } 068}