Nous avons finalement trouvé une solution de contournement comme suit:
Selon la définition column
dans lisse
def column[C](n: String, options: ColumnOption[C]*)(implicit tt: TypedType[C]): Rep[C]
Vous pouvez spécifier comment la colonne va se traduire entre le conducteur et votre code. Si vous voulez utiliser les traductions prêtes à l'emploi, mais pour Oracle, la traduction du type CLOB
ne semble pas fonctionner correctement.
Ce que nous avons fait était de définir la colonne comme String
mais en laissant Slick gérer la traduction avec notre code personnalisé. La definiton colonne est la suivante:
def myClobColumn = column[String]("CLOBCOLUMN")(new StringJdbcType)
asd
Étant StringJdbcType
notre code personnalisé pour résoudre la traduction entre notre String
à insérer (jusqu'à 65535 octets) et un Oracle CLOB
.
Le code pour StringJdbcType
est la suivante:
class StringJdbcType extends driver.DriverJdbcType[String] {
def sqlType = java.sql.Types.VARCHAR
// Here's the solution
def setValue(v: String, p: PreparedStatement, idx: Int) = {
val conn = p.getConnection
val clob = conn.createClob()
clob.setString(1, v)
p.setClob(idx, clob)
}
def getValue(r: ResultSet, idx: Int) = scala.io.Source.fromInputStream(r.getAsciiStream("DSPOLIZARIESGO"))(Codec.ISO8859).getLines().mkString
def updateValue(v: String, r: ResultSet, idx: Int) = r.updateString(idx, v)
override def hasLiteralForm = false
}
La fonction setValue
était notre salut parce que nous pourrions construire un Oracle CLOB
avec le déjà instancié PreparedStatement
et la chaîne comming de notre domaine. Dans notre implémentation, nous n'avons eu qu'à faire la plomberie et le sale boulot pour le CLOB Oracle. En résumé, le point d'extension proposé par Slick dans driver.DriverJdbcType[A]
était ce que nous utilisions réellement pour que la chose fonctionne.