Does anyone use the Oracle Slick driver combination?
Below is some sql and scala code that worked just fine
with a MySql (mariadb) database, but fails on a very simple
operation with Oracle.
It should be noted that with MySql AUTOINCREMENT was used
where as with Oracle one has to create a sequence and a trigger...
but, hey, I can not be the first person to do this.
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Slick/Oracle Jar files:
SLICK_JAR=$SCALA_HOME/../jars/slick/slick_2.11-3.0.0.jar
SLICK_CODEGEN_JAR=$SCALA_HOME/../jars/slick/slick-codegen_2.11-3.0.0.jar
SLICK_EXTENSIONS_JAR=$SCALA_HOME/../jars/slick/slick-extensions_2.11-3.0.0.jar
OJDBC_JAR=$HOME/jars/ojdbc7.jar
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Sql:
DROP TABLE Machine CASCADE CONSTRAINTS;
DROP SEQUENCE Machine_seq;
CREATE TABLE Machine (
id INT NOT NULL,
name VARCHAR(40) NOT NULL,
cpu_type VARCHAR(40),
cpu_model VARCHAR(40),
cpu_speed VARCHAR(20),
bridge VARCHAR(60),
CONSTRAINT machine_id_pk PRIMARY KEY(id),
CONSTRAINT machine_name_ix UNIQUE(name)
);
CREATE SEQUENCE Machine_seq;
CREATE OR REPLACE TRIGGER Machine_trigger
BEFORE INSERT ON Machine
FOR EACH ROW
BEGIN
SELECT Machine_seq.NEXTVAL
INTO :
new.id FROM dual;
END;
/
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Scala code:
// This fails for any combination of values (all None, all Some, or mixed)
val name: String = "dtx_14"
val cpu_type: Option[String] = Some("Intel")
val cpu_model: Option[String] = None
val cpu_speed: Option[String] = None
val bridge: Option[String] = Some("sandy")
DB.withSession{ implicit session =>
Tables.Machine.map(r =>
(
r.name,
r.cpuType,
r.cpuModel,
r.cpuSpeed,
r.bridge
)
) += (
name,
cpu_type,
cpu_model,
cpu_speed,
bridge
)
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Exception:
java.sql.SQLSyntaxErrorException: ORA-00911: invalid character
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:943)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1150)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:4875)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1361)
at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker$$anonfun$internalInsert$1.apply(JdbcInsertInvokerComponent.scala:190)
at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker$$anonfun$internalInsert$1.apply(JdbcInsertInvokerComponent.scala:187)
at slick.jdbc.JdbcBackend$SessionDef$class.withPreparedStatement(JdbcBackend.scala:302)
at slick.jdbc.JdbcBackend$BaseSession.withPreparedStatement(JdbcBackend.scala:386)
at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.preparedInsert(JdbcInsertInvokerComponent.scala:177)
at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.internalInsert(JdbcInsertInvokerComponent.scala:187)
at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.insert(JdbcInsertInvokerComponent.scala:182)
at slick.driver.JdbcInsertInvokerComponent$InsertInvokerDef$class.$plus$eq(JdbcInsertInvokerComponent.scala:72)
at slick.driver.JdbcInsertInvokerComponent$BaseInsertInvoker.$plus$eq(JdbcInsertInvokerComponent.scala:152)
at Main$$anon$1$$anonfun$load_machine_data$1$$anonfun$apply$60.apply(OImportPara.sh:2763)
at Main$$anon$1$$anonfun$load_machine_data$1$$anonfun$apply$60.apply(OImportPara.sh:2754)
............
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Googling about,
ORA-00911: invalid character
happens, for instance, when one creates a statement and include a
trailing ";" within the SQL which is sent via JDBC to the Oracle
database.
Does the slick Oracle driver add some extra characters???
Time is short and if the Slick-Oracle combination is actually
broken, then I must abandon Slick.
Thanks
Richard