【问题标题】:PreparedStatement errorPreparedStatement 错误
【发布时间】:2010-09-23 01:39:06
【问题描述】:

我有两个 select 语句,并为这两个语句创建“union all”。然后,我使用 PreparedStatement,当我将 String 设置为此 PreparedStatement 时,它显示 "java.sql.SQLException: Missing IN or OUT parameter at index:: 2"。

在我参观了谷歌之后,有些人对每个“?”都这么说。在 sql 语句中,我应该写 setString。对于我的情况,我有两个选择语句,所以我有两个“?”但我“联合所有”,所以我不确定是否假定一个“?”或两个“?”。但是当我尝试写两个 setString 之类的 preparedStatement.setString(1,ApplicationNo); preparedStatement.setString(2,ApplicationNo); ,它显示 “ORA-00918: column ambiguously defined”。

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

我的工会选择语句是

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。

【问题讨论】:

    标签: java sql oracle jdbc ora-00918


    【解决方案1】:

    我将您的查询改写为:

    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 语句的后半部分不需要为列设置别名,UNION 只需要 SELECT 子句中的列数相同并且它们的数据类型匹配
    • 不要对不需要的内容进行子查询
    • 始终在将查询转储到准备好的语句之前在 PLSQL Developer/etc 中测试查询。这看起来可能是一个带有单个参数的存储过程(假设双方的 appl_no 相同)

    【讨论】:

      【解决方案2】:

      我看不出为什么你应该构建这个查询并一遍又一遍地 gc-ing 它。我会把它变成一个静态的最终字符串一次并完成它。

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

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

      【讨论】:

      • 我试过了,它显示“ORA-00918: column ambiguously defined”
      • 您能否在 SQL*Plus 中成功运行该查询,而将 Java 排除在外?可能是查询本身的问题。
      • 就个人而言,我认为 OMGPonies 的回答比我的要好。我不知道 SQL 是否真的有效,但还有更多细节。
      猜你喜欢
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2014-06-27
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      相关资源
      最近更新 更多