【发布时间】:2013-11-18 03:58:01
【问题描述】:
我使用 HSQL 作为内存数据库来“模拟”用于测试目的的 Oracle 用于生产的数据库。
我陷入了 HSQL 和 Oracle 之间的一个兼容性问题。即,它抱怨缺少 EMPTY_CLOB()。
有什么方法可以将 Oracle 的 empty_clob() 函数提供给 HSQL 的上下文?
我试过了,例如声明
CREATE FUNCTION empty_clob()
RETURNS CLOB
NO SQL
LANGUAGE JAVA PARAMETER STYLE JAVA
EXTERNAL NAME 'CLASSPATH:com.example.HsqlUtil.emptyClob'
并在 Java 代码中实现此功能
package com.example;
public class HsqlUtil {
public static java.sql.Clob emptyClob() throws SQLException {
return oracle.sql.CLOB.getEmptyCLOB();
// return new org.hsqldb.jdbc.JDBCClob(""); also does not work
}
}
但它会导致
Caused by: org.hsqldb.HsqlException: Java execution: EMPTY_CLOB
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.Routine.invokeJavaMethod(Unknown Source)
at org.hsqldb.Routine.invoke(Unknown Source)
at org.hsqldb.FunctionSQLInvoked.getValueInternal(Unknown Source)
at org.hsqldb.FunctionSQLInvoked.getValue(Unknown Source)
at org.hsqldb.StatementDML.getInsertData(Unknown Source)
at org.hsqldb.StatementInsert.getResult(Unknown Source)
at org.hsqldb.StatementDMQL.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 25 more
Caused by: org.hsqldb.HsqlException: incompatible data type in conversion
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.types.ClobType.convertJavaToSQL(Unknown Source)
解决方案:
按照fredt的建议,就是提供如下SQL函数:
create function empty_clob()
returns VARCHAR (20)
return '';
【问题讨论】:
-
为什么不直接使用XE?
-
在 Oracle 和 HSQLDB 中都不需要
empty_clob() -
@a_horse_with_no_name 我在生产代码中使用了 empty_clob() 函数。我想对此代码运行测试,但使用内存中的 HSQLDB 而不是 Oracle DB。
-
我明白这一点,但您不需要
empty_clob()- 即使是 Oracle。由于您可以从 Oracle 代码中删除它,因此您可以在 HSQLDB 上运行它。 (虽然我不相信在不同的 DBMS 上运行测试有意义 - 但这是一个不同的讨论)。 -
empty_clob() 用于生产代码。你知道我可以用什么代码代替那个函数吗?