Java 甲骨文';HSQL中的s empty_clob()

Java 甲骨文';HSQL中的s empty_clob(),java,oracle,jdbc,hsqldb,Java,Oracle,Jdbc,Hsqldb,我使用HSQL作为内存中的数据库来“模拟”用于测试Oracle在生产中使用的数据库 我被一个HSQL和Oracle之间的兼容性问题绊住了。也就是说,它抱怨缺少空的_CLOB() 有没有办法将Oracle的空函数提供给HSQL的上下文? 我试过了,比如说 CREATE FUNCTION empty_clob() RETURNS CLOB NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'CLASSPATH:com.example.Hs

我使用HSQL作为内存中的数据库来“模拟”用于测试Oracle在生产中使用的数据库

我被一个HSQL和Oracle之间的兼容性问题绊住了。也就是说,它抱怨缺少空的_CLOB()

有没有办法将Oracle的空函数提供给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的建议,is将提供如下SQL函数:

create function empty_clob() 
returns VARCHAR (20)
return ''; 

尝试将empty_clob()函数编写为返回一个空的VARCHAR字符串,而不是返回clob。

只是为了添加到答案中,顺便说一句,如果要创建JDBC脚本并创建架构,那么必须添加

create function empty_clob() 
returns VARCHAR (20)
return ''; 
在添加之前

CREATE SCHEMA schema_name

为什么不使用?您不需要Oracle或in中的
empty\u clob()
功能HSQLDB@a_horse_with_no_name我在我的生产代码中使用空的函数。我想对这段代码运行测试,但使用内存中的HSQLDB而不是Oracle DB。我理解这一点,但您不需要
空的\u clob()
——即使对于Oracle也不需要。由于可以从Oracle代码中删除它,所以可以在HSQLDB上运行它。(虽然我不相信在不同的DBMS上运行测试是有意义的,但这是一个不同的讨论)。在生产代码中使用。你知道我可以用什么代码来代替那个函数吗?