带日期输入参数的 hsqldb 过程

Posted

技术标签:

【中文标题】带日期输入参数的 hsqldb 过程【英文标题】:hsqldb procedure with date Input parameter 【发布时间】:2018-03-21 10:10:25 【问题描述】:

我需要为一些下载操作编写测试。这个操作从 MSSQL 数据库调用过程,获取结果集和 java 制作一些东西。对于测试,我使用 hsqldb。

My procedure:
CREATE PROCEDURE map.Get1(IN packageName varchar(100), 
IN downloadDate DATE) 
READS SQL DATA DYNAMIC RESULT SETS 1 BEGIN ATOMIC
DECLARE result CURSOR WITH RETURN FOR SELECT * FROM map.tvschedule FOR READ ONLY; 
OPEN result; 
END

这个程序不起作用,我有一个例外

调用map.GET1('Genre','2018-03-10');

[42561][-5561] incompatible data type in conversion
java.lang.RuntimeException: org.hsqldb.HsqlException: incompatible data type 
in conversion

但是这个(没有日期参数)效果很好:

CREATE PROCEDURE map.Get1(IN packageName varchar(100)) 
READS SQL DATA DYNAMIC RESULT SETS 1 BEGIN ATOMIC
DECLARE result CURSOR WITH RETURN FOR SELECT * FROM map.tvschedule FOR READ ONLY; 
OPEN result; 
END

调用 map.GET1('Genre');

第一个需要的行

需要的第二行

我不打算使用输入参数,但我需要这个程序来查看我将要使用的。

我的问题是如何在 hsqldb 程序中使用日期输入参数?

更新1: 我使用了 TO_DATE,现在效果很好,但是我的结果集中没有数据,我的 java 代码是:

try (CallableStatement callableStatement = connection.prepareCall(" call 
map.GetGenreProtocol( ?, ? ) ")) 
        callableStatement.setString(1, packageName);
        callableStatement.setDate(2, date);
        callableStatement.execute();
        ResultSet resultSet = callableStatement.getResultSet();


        while (resultSet.next()) 

           Interval Interval = new Interval();
            Interval.setDuration(resultSet.getInt("duration"));
           Interval.setMappingTargetId(resultSet.getInt("mappingTargetId"));
            Interval.setGenreId(resultSet.getInt("genreId"));
            Interval.setStart(resultSet.getLong("start"));
            Interval.setCategoryId(resultSet.getInt("categoryId"));
            Interval.setCategoryName(resultSet.getString("categoryName"));
            Interval.setGenreName(resultSet.getString("genreName"));
            Interval.setDescription(resultSet.getString("description"));

            Intervals.add(Interval);
        
    

【问题讨论】:

callableStatement.execute()之后添加callableStatement.getMoreResults() 【参考方案1】:

使用TO_DATE 函数。

例如:

call map.GET1('Genre', TO_DATE('2018-03-10', 'YYYY-MM-DD'));

我猜你需要创建一个返回表而不是过程的函数:

CREATE FUNCTION map.Get1(IN packageName  VARCHAR(100),
                         IN downloadDate DATE)
  RETURNS TABLE(.....)
  READS SQL DATA
BEGIN ATOMIC
  ....
END;

【讨论】:

它正在工作,但结果集为空。你能帮我吗?我在第一篇文章中添加了我班级的代码。

以上是关于带日期输入参数的 hsqldb 过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 adsweb 中执行带日期的存储过程

oracle用存储过程实现对输入的日期判断是属于一年中的第几周,如20120101~20120107是

调用SQL的存储过程时怎样输入时间类型的参数

oracle存储过程输入参数能否为空

如何创建带参数的 Oracle 存储过程?

Oracle带输入输出参数的存储过程