2010-09-23 68 views
0

我有两个select语句,并为这两个语句创建'union all'。然后,我使用PreparedStatement,当我将String设置为PreparedStatement时,它显示“java.sql.SQLException:在index :: 2处缺少IN或OUT参数”。PreparedStatement error

我逛过谷歌后,有人说每个“?”在sql语句中,我应该写setString。对于我的情况,我有两个选择的陈述,所以我有两个“?”但我“联合所有”,所以我不确定是否假设一个“?”或两个“?”。但是当我试图编写两个setString像 preparedStatement.setString(1,ApplicationNo);preparedStatement.setString(2,ApplicationNo); ,它显示“ORA-00918:不明确定义的列”。

我不知道如何解决这个问题。

我的工会选择statment是

query.append("select TO_CHAR(TRUNC(SYSDATE),'DD MONTH,YYYY'),a.appl_no,a.assigned_to,b.co_name,b.co_name2,a.credit_acct_no,a.credit_bank_no,a.credit_branch_no,a.service_id "); 
query.append("from newappl a, newappl_hq b where b.appl_no = a.appl_no and a.appl_no=(select appl_no from newappl where appl_no=?) and rownum=1 and credit_status = 'CRPEND'"); 
query.append(" union all "); 
query.append("select TO_CHAR(TRUNC(SYSDATE),'DD MONTH,YYYY'),a.appl_no,a.assigned_to,c.trading_name co_name, ' ' co_name2, d.bank_acct_no credit_acct_no, d.bank_no credit_bank_no, d.bank_branch_no credit_branch_no,a.service_id "); 
query.append("from newappl a,newappl_hq b, newappl_ret c, newappl_ret_bank d where b.appl_no = a.appl_no or a.appl_no = c.appl_no and c.ret_id= d.ret_id and a.appl_no=(select appl_no from newappl_ret where appl_no=?) and rownum=1 and credit_status = 'CRPEND'");* 

了setString是了PreparedStatement.setString(1,ApplicationNo);

当我搜索了setString例如,有两个不同的参数,如果有两个像了setString

preparedStatement.setString(1,ApplicationNo); 
preparedStatement.setString(2,LoginID); 

但我需要ApplicationNo两种选择statments。

回答

1

我看不出为什么你应该建立这个查询,并一遍又一遍地将它重新命名。我会把它作为一个静态的最终字符串,并完成它。

如果你需要两次,为什么你不能这样做?

ps.setString(1, applicationNumber); 
ps.setString(2, applicationNumber); 
+0

我试过了,它显示“ORA-00918:列模糊定义” – daydream 2010-09-23 01:47:01

+0

您可以成功运行该查询在SQL * Plus中,让Java脱离等式?可能是查询本身的问题。 – duffymo 2010-09-23 01:50:10

+0

是的,thx和它解决了 – daydream 2010-09-23 05:10:01

4

我重新写你的查询为:

SELECT TO_CHAR(SYSDATE,'DD MONTH,YYYY'), 
     a.appl_no, 
     a.assigned_to, 
     b.co_name, 
     b.co_name2, 
     a.credit_acct_no, 
     a.credit_bank_no, 
     a.credit_branch_no, 
     a.service_id 
    FROM newappl a 
    JOIN newappl_hq b ON b.appl_no = a.appl_no 
WHERE a.appl_no = ? 
    AND rownum = 1 
    AND credit_status = 'CRPEND' 
UNION ALL 
SELECT TO_CHAR(SYSDATE,'DD MONTH,YYYY'), 
     a.appl_no, 
     a.assigned_to, 
     c.trading_name, 
     ' ', 
     d.bank_acct_no, 
     d.bank_no, 
     d.bank_branch_no, 
     a.service_id 
    FROM newappl a 
    JOIN newappl_ret c ON c.appl_no = a.appl_no 
    JOIN newappl_ret_bank d ON d.ret_id = c.ret_id 
WHERE c.appl_no = ? 
    AND rownum = 1 
    AND credit_status = 'CRPEND' 

从我所看到的,ORA-00918是关于参考credit_status列。在涉及的表格中,是否有多个credit_status列?因为它是任一查询中唯一的未别名列。

夫妇其他事情提:

  • 不需要TRUNC如果你要TO_CHAR它只是日/月/年信息的日期。
  • 不需要在UNION'd语句的后半部分别名列,UNION只需要在SELECT子句中有相同数量的列,并且它们的数据类型匹配
  • 不要子查询你不需要的东西, t需要
  • 总是在将其转储到Prepared Statement之前在PLSQL Developer/etc中测试查询。这看起来像它可能是一个具有单个参数的存储过程(假设两侧的appl_no是相同的)
+1

+1 - 这是高级答案。 – duffymo 2010-09-23 09:27:12