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.