1

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

我被困在 HSQL 和 Oracle 之间的一个兼容性问题上。也就是说,它抱怨缺少 EMPTY_CLOB()。

有没有办法为 HSQL 的上下文提供 Oracle 的 empty_clob() 函数?

我试过例如声明

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 ''; 
4

2 回答 2

2

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

于 2013-11-07T11:11:37.927 回答
2

只是为了添加答案,顺便说一句,如果您正在创建 JDBC 脚本并创建了一个模式,那么您必须添加

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

在添加之前

CREATE SCHEMA schema_name
于 2014-12-30T17:42:13.960 回答