2010-09-23 70 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