繁体   English   中英

将结果集列值分配给变量以在另一个SQL语句中使用? 爪哇

[英]Assigning resultset column value to a variable for use in another SQL Statement?? Java

我正在用Java创建一个以数据为中心的Web服务,以部署到Glassfish。 到目前为止,除一种方法外,我所有的方法都可以正常工作。

我试图按照以下代码将结果集中的值分配给变量,以便在另一个SQL语句中使用。 我不确定是否可能,或者我的SQL错误,但是任何想法都将不胜感激。

ResultSet rset1 = stmt1.executeQuery("SELECT * 
                                        FROM WorkOrder 
                                       WHERE WorkOrderID = '"+workOrderID+"'");
Integer custID = rset1.getInt(3);

ResultSet rset2 = stmt2.executeQuery("SELECT * 
                                        FROM Customer 
                                       WHERE CustID = '"+custID+"'");
Integer quoteID = rset1.getInt(2);

ResultSet rset3 = stmt3.executeQuery("SELECT * 
                                        FROM Quote 
                                       WHERE QuoteID = '"+quoteID+"'");

您发布的内容可以而且应该在单个查询中完成-不太复杂,并且与数据库的来回流量较少[不必要]:

SELECT q.*
  FROM QUOTE q
 WHERE EXISTS (SELECT NULL 
                FROM CUSTOMER c 
                JOIN WORKORDER wo ON wo.custid = c.custid
               WHERE c.quoteid = q.quoteid
                 AND wo.workorderid = ?)

不使用JOIN的原因是,如果与多个工作订单/客户/等相关,则存在重复QUOTE值的风险。

另外:

  • 数值数据类型(quoteid,custid等)不应使用单引号引起来-无需依赖隐式数据类型转换。
  • 您应该使用参数化查询,而不是动态SQL

您可以调用ResultSet.next()。

if(rset1.next())
 {
   Integer custID = rset1.getInt(3);
   ....
 }

OMG Ponies提供的注释确实很重要,但是并不能真正回答问题。 AVD也是正确的。 我已经整理了一下,并包含了准备好的语句。 请使用准备好的语句。 他们将帮助您晚上入睡。

PreparedStatement pstmt1 = con.prepareStatement(
    "SELECT * FROM WorkOrder WHERE WorkOrderID = ?");
PreparedStatement pstmt2 = con.prepareStatement(
    "SELECT * FROM Customer WHERE CustID = ?");
PreparedStatement pstmt3 = con.prepareStatement(
    "SELECT * FROM Quote WHERE QuoteID = ?");

pstmt1.setInt(1, workOrderId)
ResultSet rset1 = pstmt1.executeQuery();

// test validity of rset1 
if(rset1.next()) {
    pstmt2.setInt(1, rset1.getInt(3))
    ResultSet rset2 = pstmt2.executeQuery();

    // test validity of rset2
    if(rset2.next()) {
        pstmt3.setInt(1, rset1.getInt(2))
        ResultSet rset3 = pstmt3.executeQuery();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM