【问题标题】:JDB: DB2-Query with WITH clause and two host variables does not workJDB:带有 WITH 子句和两个主变量的 DB2-Query 不起作用
【发布时间】:2012-04-20 12:03:47
【问题描述】:

我已经使用 WITH 子句优化了我的 DB2 查询。现在它很快,但不再在 JDBC 下工作。有人有想法吗?谢谢!

WITH tmp AS (SELECT ID_EINSENDUNG, BEURTEILUNG, VERSANDDAT_BVD, LASTUSER 
FROM BVDT.TEINSENDUNG_BVD WHERE VERSANDDAT_BVD = 
'2008-02-26' --HOST VARIABLE 1
) 
SELECT ID_EINSENDUNG, VERSANDDAT_BVD FROM tmp WHERE ID_EINSENDUNG > 
4100  --HOST VARIABLE 2

错误消息:ERRORCODE=-4461,SQLSTATE=42815 SQLState:42815 错误代码:-4461

Java 代码:

public DBCursor searchViewLandwirtOhrmarke() throws Exception {

    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("WITH tmp AS " +
            "(SELECT ID_EINSENDUNG, BEURTEILUNG, VERSANDDAT_BVD, LASTUSER FROM BVDT.TEINSENDUNG_BVD WHERE VERSANDDAT_BVD = ?) " +
            "SELECT ID_EINSENDUNG, VERSANDDAT_BVD FROM tmp WHERE ID_EINSENDUNG > ?");


    prepareStatement(stringBuilder.toString());

    ps.setDate(1, DateUtils.getSQLDate("26.02.2008"));  
    ps.setInt(2,new Integer(4100));

    executeCursorSelect();
    return this;
}   

public EinsendungBvd nextViewLandwirtOhrmarke() throws Exception {
    if (endFetch()) {
        return null;
    }
    EinsendungBvd result = new EinsendungBvd(dbConn);
    result.setId_einsendung(new Integer(rs.getInt(1)));
    if (rs.wasNull()) {
        result.setId_einsendung(null);
    }
    result.setVersanddat_bvd(rs.getDate(11));

    return result;
}

【问题讨论】:

    标签: java sql jdbc db2


    【解决方案1】:

    对我来说似乎是日期格式问题。尝试将ps.setDate(1, DateUtils.getSQLDate("26.02.2008")); 中的日期更改为ps.setDate(1, DateUtils.getSQLDate("2008-02-26"));。我不知道 DateUtil 规范,所以这只是一个疯狂的猜测..(有关 SQLSTATE/ERRORCODES 的列表,请参阅here

    【讨论】:

    • 对不起,我没有提到。 DateUtils 从欧洲日期格式字符串(如“DD.MM.YYYY”)创建 java.sql.Date。我不认为这是问题所在。不过谢谢你的回复。
    【解决方案2】:

    查看 IBM DB2 LUW 9.7 版 Error codes issued by the IBM Data Server Driver for JDBC and SQLJ 以获取错误代码 -4461

    -4461 text-from-getMessage 42815

    说明:指定的值无效或超出范围。

    用户响应:调用 SQLException.getMessage 以检索有关问题的特定信息。

    要尝试的事情:

    1. 记录SQLException.getMessage()的值。
    2. 验证VERSANDDAT_BVDID_EINSENDUNG 的数据类型。
    3. 一次用一个参数测试查询;找出哪个参数是违规者。
    4. 验证DateUtils.getSQLDate() 是否正确解析您的日期字符串;比较来自DateUtils.getSQLDate()Date 上的Date.getTime() 和来自SimpleDateFormat.parse()Date 的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多