Ошибка PreparedStatement - PullRequest
       25

Ошибка PreparedStatement

0 голосов
/ 23 сентября 2010

У меня есть два оператора select и я делаю 'union all' для этих двух операторов. Затем я использую PreparedStatement, и когда я устанавливаю значениеString в значение prepareStatement, оно показывает "java.sql.SQLException: отсутствует параметр IN или OUT в index :: 2".

После того, как я совершил поездку по Google, некоторые люди говорят, что для каждого "?" в sql statment я должен написать 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 равно prepareStatement.setString (1, ApplicationNo);

Когда я искал пример setString, есть два разных параметра, если есть два setString вроде

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

Но мне нужно ApplicationNo для обоих выбранных показателей.

Ответы [ 2 ]

4 голосов
/ 23 сентября 2010

Я переписал ваш запрос как:

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, для UNION требуется только одинаковое количество столбцов в предложении SELECT и соответствие их типов данных
  • не запрашивайте то, что вам не нужно
  • всегда проверяйте запрос в PLSQL Developer / etc, прежде чем выгружать его в подготовленный оператор.Похоже, это может быть хранимая процедура с одним параметром (при условии, что appl_no одинаково для обеих сторон)
1 голос
/ 23 сентября 2010

Я не вижу причин, почему вы должны создавать этот запрос и отбирать его снова и снова. Я бы однажды сделал это статической финальной строкой и покончил бы с этим.

Если вам это нужно дважды, почему вы не можете это сделать?

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