0

2 つの select ステートメントがあり、これら 2 つのステートメントに対して「union all」を作成します。次に、PreparedStatement を使用し、この PreparedStatement に文字列を設定すると、 「java.sql.SQLException: Missing IN or OUT parameter at index:: 2」と表示されます。

私がグーグルをツアーした後、何人かの人々はそれぞれの「?」に対してそれを言います。sql ステートメントでは、setString を記述する必要があります。私の状況では、2 つの select ステートメントがあるため、2 つの "?" があります。しかし、私は「すべてを結合」しているので、その「?」が想定されているかどうかはわかりません。または2つの「?」。しかし、 preparedStatement.setString(1,ApplicationNo); のように 2 つの setString を記述しようとすると、prepareStatement.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 は準備済みStatement.setString(1,ApplicationNo);

setStringの例を検索したところ、次のようなsetStringが2つある場合、2つの異なるパラメーターがあります

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

しかし、両方の select ステートメントに ApplicationNo が必要です。

4

2 に答える 2

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-00918credit_status列への参照に関するものです。関連するテーブルのうち、credit_status複数のテーブルに列がありますか? どちらのクエリでも、それが唯一のエイリアスされていない列だからです。

言及する他のいくつかのこと:

  • 日/月/年の情報だけを TO_CHAR する場合は、日付を TRUNC する必要はありません。
  • UNION'd ステートメントの後半で列をエイリアスする必要はありません。UNION は SELECT 句で同じ数の列のみを必要とし、それらのデータ型が一致する必要があります。
  • 必要のないサブクエリを実行しないでください
  • クエリをプリペアド ステートメントにダンプする前に、必ず PLSQL Developer/etc でクエリをテストしてください。これは、単一のパラメーターを持つストアド プロシージャのように見えます (appl_no が両側で同一であると仮定します)。
于 2010-09-23T02:22:07.360 に答える
1

このクエリを構築し、GC で何度も削除する必要がある理由はわかりません。一度静的な最終文字列にして、それで完了です。

2回必要な場合、なぜこれを行うことができないのですか?

ps.setString(1, applicationNumber);
ps.setString(2, applicationNumber);
于 2010-09-23T01:45:40.283 に答える