#java #sql #oracle
#java #sql #Oracle
Вопрос:
Я пытаюсь вызвать select
запрос из моей Java-программы, но получаю Invalid Number
ошибку. Я пытаюсь вызвать запрос примерно так
code
String[] l_arr = new String[]{"CUSTOMERCUMULATIVELIMIT"};
l_rs = JDBCEngine.executeQuery(MessageFormat.format(
" SELECT LIMITS, P.PACKAGE_ID FROM MSTGLOBALLIMITSPACKAGE P ,MSTCUSTOMERPROFILE C WHERE P.PACKAGE_ID = {0} AND C.ID_CUST = ? AND C.ID_ENTITY = ? AND C.TYPEUSER = ? AND C.ID_ENTITY = P.ID_ENTITY AND P.PACKAGE_ID NOT LIKE ?",l_arr );
Я получаю запрос примерно так:
Result
SELECT LIMITS, P.PACKAGE_ID
FROM MSTGLOBALLIMITSPACKAGE P, MSTCUSTOMERPROFILE C
WHERE P.PACKAGE_ID = CUSTOMERCUMULATIVELIMIT
AND C.ID_CUST = '00000144'
AND C.ID_ENTITY = 'B001'
AND C.TYPEUSER = 'ECU'
AND C.ID_ENTITY = P.ID_ENTITY
AND P.PACKAGE_ID NOT LIKE '*%'
Я получаю ошибку Недопустимый номер в строке P.PACKAGE_ID = {0}
. Я прошел и узнал, что если я использую to_char
, я могу избежать этой ошибки. Но я не уверен, как использовать to_char
в P.PACKAGE_ID = {0}
.
Также PACKAGE_ID
имеет тип Varchar2
и CUSTOMERCUMULATIVELIMIT
является столбцом в MSTCUSTOMERPROFILE
типа Number
.
Любая помощь или предложение будут оценены. Спасибо.
Комментарии:
1. Является ли Package_ID типом varchar или char в вашей схеме таблицы? Аналогично, как насчет других столбцов?
2. и почему вы поставили там {0} ?
3. Package_ID имеет тип
varchar2
4. @Massimo String.format()
5. почему вы используете String.format вместо параметра ? И какое значение вы передаете в нем вместо {0}?
Ответ №1:
просто добавьте to_char в свой sql, измените {0} на to_char({0})
l_rs = JDBCEngine.executeQuery(MessageFormat.format( " SELECT LIMITS, P.PACKAGE_ID FROM MSTGLOBALLIMITSPACKAGE P ,MSTCUSTOMERPROFILE C WHERE P.PACKAGE_ID = to_char({0}) AND C.ID_CUST = ? AND C.ID_ENTITY = ? AND C.TYPEUSER = ? AND C.ID_ENTITY = P.ID_ENTITY AND P.PACKAGE_ID NOT LIKE ?",l_arr );
Ответ №2:
Вы работаете с этой линией :
WHERE P.PACKAGE_ID = CUSTOMERCUMULATIVELIMIT
Поскольку здесь нет одинарных кавычек, SQL рассматривает CUSTOMERCUMULATIVELIMIT как число, а не строку.
Добавление кавычек должно решить эту проблему.
l_rs = JDBCEngine.executeQuery(MessageFormat.format(
" SELECT LIMITS, P.PACKAGE_ID FROM MSTGLOBALLIMITSPACKAGE P ,MSTCUSTOMERPROFILE C WHERE P.PACKAGE_ID = '{0}' AND C.ID_CUST = ? AND C.ID_ENTITY = ? AND C.TYPEUSER = ? AND C.ID_ENTITY = P.ID_ENTITY AND P.PACKAGE_ID NOT LIKE ?",l_arr );
Комментарии:
1. CUSTOMERCUMULATIVELIMIT — это столбец другой таблицы, а не строка.
2. Правильно. Но, как уже было сказано, PACKAGE_ID — это varchar2, а CUSTOMERCUMULATIVELIMIT — это число. Вы не можете сопоставлять данные по разным типам. Итак, проблема.