java - 准备语句错误

标签 java sql oracle jdbc ora-00918

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

在我浏览了谷歌之后,有些人对每个“?”都这么说。在sql语句中,我应该写setString。对于我的情况,我有两个 select 语句,所以我有两个“?”但我“联合所有”,所以我不确定是否假设有一个“?”或两个“?”。但是当我尝试写两个 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。

最佳答案

我将您的查询重写为:

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 相同)

关于java - 准备语句错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3774850/

相关文章:

java - 以相反的顺序更改 LinkedHashMap 项

java - 获取动态数据库模型的静态类型(使用自动迁移)

java - 在 Wicket 中为下载链接设置超时?

java - Hibernate 并发在 saveOrUpdate 上创建重复记录

java - Spring ReloadableResourceBundleMessageSource VS ResourceBundleMessageSource

mysql - SQL复杂的select语句

mysql - 我应该为 0 到 3 之间的值使用什么数据类型

mysql - sql - 使用动态选择的表名进行分组

sql - Oracle SQL TO_CHAR 可变长度

sql - Oracle 中的查询错误