Запрос выполняется на БД, но выдает исключение в Java
У меня возникли проблемы с выполнением вложенного SQL-запроса. Он отлично работает, когда я запускаю его в TOAD (для Oracle DB), но когда я пытаюсь выполнить тот же запрос из моей Java-программы, он выдает мне ошибку: ORA-00923: ключевое слово FROM не найдено там, где ожидается: вот запрос:
Select *
from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
from tb1
inner join tb2
on tb1.Number = tb2.Number
and Local in ('ENG_USA', 'ENG_CHINA', 'FR_FRENCH'))
where Number in ('7512','4706')
Как я уже упоминал, он хорошо работает на Toad и может извлекать данные, но тот же запрос вызывает исключение ORA-00923.
rset = stmt.executeQuery(Select *
from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
from tb1
inner join tb2
on tb1.Number = tb2.Number
and Local in ("+loc+"))
where Number in ("+s+")
Ответьте Цитатой
2 ответа
У меня была похожая проблема с MySQL. Моя проблема заключалась в том, что я разбил запрос на несколько строк, не оставляя пробела между 2 строками. Итак, ваш запрос должен быть:
rset = stmt.executeQuery("Select * from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division from tb1 inner join tb2 on tb1.Number = tb2.Number and Local in ("+loc+")) where Number in ("+s+")"
PS: Я хотел бы написать это как комментарий, но по некоторым причинам я не могу в этом вопросе. Сожалею!
Во-первых, я не вижу начала или конца двойных кавычек в вашем коде Java. Поскольку ваш Java-код должен скомпилироваться, чтобы получить достаточно далеко, чтобы получить ошибку Oracle, я предполагаю, что перед SELECT
двойная кавычка после последнего закрывающего парена, а затем еще один близкий родитель, соответствующий открытому парену на executeQuery
, Итак, я предполагаю, что ваш реальный код
rset = stmt.executeQuery(
"Select *
from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
from tb1
inner join tb2
on tb1.Number = tb2.Number
and Local in ("+loc+"))
where Number in ("+s+")");
Есть ли причина, по которой вы строите оператор SQL динамически, а не используете переменные связывания? Использование переменных связывания более безопасно, так как вам не нужно беспокоиться о атаках с использованием SQL-инъекций. Это более эффективно, поскольку вы не заставляете базу данных каждый раз тщательно анализировать запрос. И это спасает вас от многих видов ошибок, связанных с цитированием и экранированием. В вашем случае, предполагая, что локальная переменная loc
не содержит начальных и конечных одинарных кавычек, их нужно включить в запрос
rset = stmt.executeQuery(
"Select *
from(select tb1.Number, tb1.Desc, tb1.Local, tb2.Division
from tb1
inner join tb2
on tb1.Number = tb2.Number
and Local in ('"+loc+"'))
where Number in ("+s+")");
Если бы вы использовали переменные связывания и просто привязали loc
к первой переменной связывания, с другой стороны, вам не нужно беспокоиться о добавлении одинарных кавычек (или экранировании любых одинарных кавычек в loc
,