2017-08-25 3 views
0
  • Nous avons une table avec une colonne de CLOB (pour sauvegarder vos données JSON)
  • Comme nous comprenons (à partir de la documentation) types LOB de support lisse (http://slick.lightbend.com/doc/3.1.1/schemas.html)
  • Nous sommes en mesure d'interroger la table succesfuly. Y compris la colonne CLOB.
  • Nous sommes et non capable d'insérer un registre avec un Clob. Nous convertissons une chaîne à java.sql.Clob avec:Comment insérer un Clob dans une table Oracle avec Slick 3 et Oracle 12?

    private java.sql.Clob stringToClob(String source) 
    { 
        try 
        { 
         return new javax.sql.rowset.serial.SerialClob(source.toCharArray()); 
        } 
        catch (Exception e) 
        { 
         log.error("Could not convert string to a CLOB",e); 
         return null; 
        } 
    } 
    

mais à la fin l'exception de marée noire est la suivante:

java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob cannot be cast to oracle.sql.CLOB 

Est-ce possible?

Répondre

0

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.