【问题标题】:Oracle's empty_clob() in HSQLOracle 在 HSQL 中的 empty_clob()
【发布时间】: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() 用于生产代码。你知道我可以用什么代码代替那个函数吗?

标签: java oracle jdbc hsqldb


【解决方案1】:

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

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

添加之前

CREATE SCHEMA schema_name

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-17
      • 2011-07-17
      • 2010-10-06
      • 1970-01-01
      • 2017-03-10
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多