Запрос выполняется на БД, но выдает исключение в 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,

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