【问题标题】:HSQLDB - Oracle to_char(integer) throws " Unexpected Token : )"HSQLDB - Oracle to_char(integer) 抛出“Unexpected Token : )”
【发布时间】:2023-04-10 06:05:01
【问题描述】:

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


版本

  • 休眠:4.1.3.final.

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


我的问题

为了创建我的测试数据库,我按照tutorial 做了一些小的修改。除了使用 Oracle 中的 TO_CHAR(integer) 函数的方法外,一切正常。对于这些方法,我得到了unexpected token: )

这是导致异常的代码

select ="select p.name, to_char(p.id) "
        + " from t_player p " +
        "inner join t_job job on j.id=p.id_job ";

这是我的单元测试的一部分

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..

这是个例外

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

我如何尝试修复它

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 ";

但是,我得到了这个异常:incompatible data type in operation

2) 我将SET DATABASE SQL OSYNTAX 部分放入 cmets

引发相同的异常。

您知道如何解决这个问题吗?

感谢您的回复。

【问题讨论】:

    标签: oracle hibernate hsqldb


    【解决方案1】:

    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 作为字符串,双参数版本也返回相同。

    【讨论】:

    • 谢谢你,工作就像一个魅力! (对不起,我没有足够的声誉来支持你的答案)
    【解决方案2】:

    我在使用CAST 函数时遇到了同样的错误,如下所示:

    cast(id as VARCHAR)
    

    但正确的是:

    cast(id as VARCHAR(20))
    

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2018-03-08
      相关资源
      最近更新 更多