PreparedStatement错误

时间:2010-09-23 01:39:06

标签: java sql oracle jdbc ora-00918

我有两个select语句,并为这两个语句创建'union all'。然后,我使用PreparedStatement,当我将setString添加到这个preparedStatement时,它显示“java.sql.SQLException:在索引:: 2处缺少IN或OUT参数”。

我在谷歌周围巡视后,有人说每个“?”在sql语句中,我应该写setString。对于我的情况,我有两个选择的陈述,所以我有两个“?”但我“联合所有”,所以我不确定是否假设一个“?”或两个“?”。但是当我试着写两个setString之类的时候 的了PreparedStatement.setString(1,ApplicationNo); 了PreparedStatement.setString(2,ApplicationNo); ,它显示“ORA-00918:列模糊定义”。

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

我的工会选择陈述是

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来获取两个选择的状态。

2 个答案:

答案 0 :(得分: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列?因为它是任一查询中唯一的无别名列。

还有其他事情需要提及:

  • 如果您要将日期/月/年信息改为TO_CHAR,则无需TRUNC日期。
  • 不需要在UNION'd语句的后半部分使用别名,UNIONs只需要SELECT子句中相同数量的列,并且它们的数据类型匹配
  • 不要查询您不需要的内容
  • 在将其转储到Prepared Statement之前,始终在PLSQL Developer / etc中测试该查询。这看起来可能是一个带有单个参数的存储过程(假设appl_no对于双方都是相同的)

答案 1 :(得分:1)

我认为没有理由为什么要建立这个查询并一遍又一遍地解决它。我会把它作为一个静态的最终字符串一次并完成它。

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

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