Исключение недопустимого числа в SQL при попытке вызвать инструкцию select из Java

#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 — это число. Вы не можете сопоставлять данные по разным типам. Итак, проблема.