2013-11-06 2 views
1

Я использую HSQL как базу данных в памяти для «макета» для целей тестирования. База данных Oracle, используемая для производства.Oracle_pic_bob() в HSQL

Я столкнулся с одной проблемой совместимости между HSQL и Oracle. А именно, он жалуется, что EMPTY_CLOB() отсутствует.

Есть ли способ предоставить функцию empty_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, является обеспечение SQL как показано ниже:

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

почему не просто используйте [XE] (http://www.oracle.com/technetwork/products/express-edition/overview/index.html)? – tbone

+0

Вам не нужно 'empty_clob()' ни в Oracle, ни в HSQLDB –

+0

@a_horse_with_no_name Я использую функцию empty_clob() в моем производственном коде. Я хочу запускать тесты на этот код, но используя HSQLDB в памяти вместо Oracle DB. – Michal

ответ

2

Попробуйте написать функцию empty_clob() как возвращающую пустую строку VARCHAR вместо возврата CLOB.

1

Просто, чтобы добавить к ответу, который работает BTW, если вы создаете JDBC сценарий и создали схему, то вы должны добавить

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

, прежде чем добавить

CREATE SCHEMA schema_name 
Смежные вопросы