PreparedStatement error

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

После того, как я совершил поездку по Google, некоторые люди говорят, что для каждого "?" в sql statment я должен написать setString. Для моей ситуации у меня есть две выбранные оценки, поэтому у меня есть две "?" но я "объединяю всех", так что я не уверен, предполагается ли это "?" или два "?" Но когда я попытался написать два setString, как подготовленный State.tatement.ringString (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 is prepareStatement.setString (1, ApplicationNo);

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

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

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

3 ответа

Решение

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

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

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

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

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 одинаково для обеих сторон)

У меня также было такое же исключение при выполнении запроса в разработчике sql. Решение ниже сработало для меня, вы также можете попробовать. Вам следует переписать запрос, попробовать и посмотреть, можете ли вы использовать неоднозначную таблицу столбцов в предложении FROM вместо того, чтобы помещать ее внутри выражения JOIN.

Другие вопросы по тегам