HSQLDB-Oracle到“字符(整数)抛出”;意外标记:)”;

HSQLDB-Oracle到“字符(整数)抛出”;意外标记:)”;,oracle,hibernate,hsqldb,Oracle,Hibernate,Hsqldb,我正在Hsqldb中进行集成测试。我的生产数据库是Oracle数据库 版本 Hibernate:4.1.3.final Hsqldb:2.3.3。(我不能使用2.3.4,因为它不能在一次点击中运行我的所有junit测试。) 我的问题 为了创建我的测试数据库,我做了一些小的修改。除了使用Oracle中的TO_CHAR(integer)函数的方法外,其他方法都可以正常工作。对于这些方法,我得到了一个意外标记:) 这是导致异常的代码 select ="select p.name, to_cha

我正在Hsqldb中进行集成测试。我的生产数据库是Oracle数据库


版本
  • Hibernate:4.1.3.final

  • Hsqldb:2.3.3。(我不能使用2.3.4,因为它不能在一次点击中运行我的所有junit测试。)


我的问题 为了创建我的测试数据库,我做了一些小的修改。除了使用Oracle中的TO_CHAR(integer)函数的方法外,其他方法都可以正常工作。对于这些方法,我得到了一个
意外标记:)

这是导致异常的代码

select ="select p.name, to_char(p.id) "
        + " from t_player p " +
        "inner join t_job job on j.id=p.id_job ";
Caused by: org.hsqldb.HsqlException: unexpected token: )
    at org.hsqldb.error.Error.parseError(Unknown Source)
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
    at org.hsqldb.ParserDQL.readExpression(Unknown Source)
    at org.hsqldb.ParserDQL.readSQLFunction(Unknown Source)
    at org.hsqldb.ParserDQL.readColumnOrFunctionExpression(Unknown Source)
    at org.hsqldb.ParserDQL.XreadSimpleValueExpressionPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesValueExpressionPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesFactor(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesTerm(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesCommonValueExpression(Unknown Source)
    at org.hsqldb.ParserDQL.XreadValueExpression(Unknown Source)
    at org.hsqldb.ParserDQL.XreadSelect(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
    at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
    at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
    at org.hsqldb.Session.compileStatement(Unknown Source)
    at org.hsqldb.StatementManager.compile(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 41 more
这是我单元测试的一部分

public void testFindPlayer() throws ClassNotFoundException, SQLException {

    Class.forName("org.hsqldb.jdbcDriver");
    Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:DB", "sa", "");
    String syntax_ora = "SET DATABASE SQL SYNTAX ORA TRUE";
    PreparedStatement ps_ora = connection.prepareStatement(syntax_ora);
    ps_ora.execute();
    ps_ora.close();
    connection.close();

    List<String[]> actual_player = Player.findPlayer("Name");
    List<String[]> expected_player =  new ArrayList<String[]>(); 
    //etc..

我是如何试图修复它的 1) 我尝试了Oracle的另一个函数,它是
to_char(number,'format')
。 基本上,我使用以下内容更改“选择零件”:

select ="select p.name, to_char(p.id,'999999') "
    + " from t_player p " +
    "inner join t_job job on j.id=p.id_job ";
但是,我得到了这个异常:
操作中不兼容的数据类型

2) 我将
设置数据库SQL OSYNTAX
部分放入注释中

提出了同样的例外情况

你对如何解决这个问题有什么想法吗


感谢您的回复。

HSQLDB的内置TO_CHAR函数只支持日期和时间戳参数

您可以为数值创建用户定义的TO_CHAR函数。例如:

CREATE FUNCTION TO_CHAR(param DECIMAL) RETURNS VARCHAR(20) 
    RETURN CAST(param AS VARCHAR(20))

CREATE FUNCTION TO_CHAR(param DECIMAL, format VARCHAR(20)) RETURNS VARCHAR(20) 
    RETURN CAST(param AS VARCHAR(20))

现在TO_CHAR(p.id)将以字符串形式返回id,两个arge版本也返回相同的id。

我使用
CAST
函数时出现了相同的错误,如下所示:

cast(id as VARCHAR)
但正确的答案是:

cast(id as VARCHAR(20))

谢谢你,工作得很有魅力!(对不起,我没有足够的声誉来支持你的回答)