使用别名时 JDBC 结果集不起作用我收到“ java.sql.SQLSyntaxErrorException: ORA-00905: missing keyword”

Posted

技术标签:

【中文标题】使用别名时 JDBC 结果集不起作用我收到“ java.sql.SQLSyntaxErrorException: ORA-00905: missing keyword”【英文标题】:JDBC resultset not working when using aliases I receive " java.sql.SQLSyntaxErrorException: ORA-00905: missing keyword" 【发布时间】:2016-12-18 19:01:48 【问题描述】:

我想执行这个查询,但它给了我一个没有使用变量的错误,但它给了我一个错误 ORA-00905:缺少关键字。 我在 SQL Developer 中测试了查询,它运行没有错误。我可能认为这是驱动程序问题或 JDBC 的语法问题。但我不知道这是代码:

    public List<ReimbBean> getAllReimb() 

    String sql = "select reim.reimb_id, reim.reimb_amount,"
            + "reim.reimb_submitted, reim.reimb_resolved, "
            + "CONCAT(CONCAT(u.user_first_name,' '),"
            + " u.user_last_name) AS \"REIMB_AUTHOR\", "
            + "reim.REIMB_RESCRIPTION, rst.REIMB_STATUS, "
            + "rtype.REIMB_TYPE, CONCAT(CONCAT(urs.user_first_name,'   '), "
            + "urs.user_last_name) AS \"REIMB_RESOLVER\""
            + "FROM ERS_REIMBURSTMENT reim"
            + "LEFT JOIN ERS_USERS u"
            + "ON u.ERS_USERS_ID = reim.REIMB_AUTHOR"
            + "LEFT JOIN ERS_REIMBURSTMENT_STATUS rst"
            + "ON rst.REIMB_STATUS_ID = reim.REIMB_STATUS_ID"
            + "LEFT JOIN ERS_REIMBURSTMENT_TYPE rtype"
            + "ON rtype.reimb_type_id = reim.REIMB_TYPE_ID"
            + "LEFT JOIN ERS_USERS urs"
            + "ON urs.ERS_USERS_ID = reim.REIMB_RESOLVER"
            + "ORDER BY reim.reimb_id";
  List<ReimbBean> reimbAllList = new ArrayList<>();  
  ReimbBean reimb = new ReimbBean();

  try 
       PreparedStatement preparedStatement =    conn6.prepareStatement(sql);

            ResultSet rs = preparedStatement.executeQuery(); 

        while(rs.next())

            reimb.setReimbAmount(rs.getDouble("reimb_Amount"));
            reimb.setReimbDescript(rs.getString("reimb_Description"));
            reimb.setReimbSubmitted(rs.getTimestamp("reimb_Submitted"));
            reimb.setReimbAuthor(rs.getInt("reimb_Author"));
            reimb.setReimbResolved(rs.getTimestamp("reimb_Resolved"));
            reimb.setReimbResolver(rs.getInt("reimb_Resolver"));
            reimb.setReimbStatusID(rs.getInt("reimb_Status_ID"));
            reimb.setReimbTypeID(rs.getInt("reimb_Type_ID"));

            reimbAllList.add(reimb);
           

我在网上看到 preapareStatement 不能只绑定对象变量,所以另一种方法是显式定义它们,所以我创建了一个声明部分并将字段替换为字符串变量,但错误仍然存​​在。

【问题讨论】:

【参考方案1】:

您在很多这些字符串的末尾都缺少空格:

String sql = "select reim.reimb_id, reim.reimb_amount,"
           + "reim.reimb_submitted, reim.reimb_resolved, "
           + "CONCAT(CONCAT(u.user_first_name,' '),"
           + " u.user_last_name) AS \"REIMB_AUTHOR\", "
           + "reim.REIMB_RESCRIPTION, rst.REIMB_STATUS, "
           + "rtype.REIMB_TYPE, CONCAT(CONCAT(urs.user_first_name,'   '), "
           + "urs.user_last_name) AS \"REIMB_RESOLVER\" " // Here
           + "FROM ERS_REIMBURSTMENT reim " // and here
           + "LEFT JOIN ERS_USERS u " // and here
           + "ON u.ERS_USERS_ID = reim.REIMB_AUTHOR " // and here
           + "LEFT JOIN ERS_REIMBURSTMENT_STATUS rst " // and here
           + "ON rst.REIMB_STATUS_ID = reim.REIMB_STATUS_ID " // and here
           + "LEFT JOIN ERS_REIMBURSTMENT_TYPE rtype " // and here
           + "ON rtype.reimb_type_id = reim.REIMB_TYPE_ID " // and here
           + "LEFT JOIN ERS_USERS urs " // and here
           + "ON urs.ERS_USERS_ID = reim.REIMB_RESOLVER " // and here
           + "ORDER BY reim.reimb_id";

【讨论】:

这绝对有效,但现在我有这个错误“java.sql.SQLException:无法转换为内部表示”,我假设因为我使用了一个连接语句来获取CONCAT() 函数中用户的全名是一个字符串,但我使用结果集来返回他们的 id,它是一个 int。我该如何解决这个问题? 包含“reimb.setReimbAuthor(rs.getInt("reimb_Author"));”的行 这里是表格及其对应字段的列表: @user3116769 reimb_Author 显然是一个字符串(正如您所指出的,当您使用 concat 生成它时)。您应该使用rs.getString 来检索其值,而不是rs.getInt ERS_Reimburstment_Type( Reimb_Type_ID NUMBER NOT NULL, Reimb_Type VARCHAR2(10) NOT NULL, CONSTRAINT Reimb_Type_PK PRIMARY KEY (Reimb_Type_ID)

以上是关于使用别名时 JDBC 结果集不起作用我收到“ java.sql.SQLSyntaxErrorException: ORA-00905: missing keyword”的主要内容,如果未能解决你的问题,请参考以下文章

Django defer() 和 only() 查询集不起作用?

Druid SQL 查询汇总和多维数据集不起作用

在 JDBC 中为 SQL Query 插入单引号不起作用

构建整个 SSAS 多维数据集不起作用,按维度构建维度 - 构建顺序?

Google Material 图标、轮廓、圆形、双色调、锐利集不起作用

淘汰赛js jquery-mobile可折叠集不起作用