Реализация SQL Firebird в java/IBSQL

поэтому попытался поместить этот код SQL в мое java-приложение:

    SELECT DISTINCT
  StRzImRo.Rohstoff, StRo.Bezeichnung,
CAST (SUM(BwLsImAt.Lieferungen * StRzImRo.Menge * StAt.PROD__REZEPTURGEWICHT / Coalesce(StRz.PARM__BEZUGSGROESSE,1))  AS NUMERIC (9,3)) Rohstoffverbrauch_Gesamt FROM BwLsImAt       

JOIN StAt ON (StAt.IntRowId = BwLsImAt.Artikel)
JOIN StRz ON (StRz.IntRowId = StAt.PROD__REZEPTUR)
JOIN StRzImRo ON (StRzImRo.Master = StRz.IntRowId)
JOIN StRo ON (StRzImRo.Rohstoff = StRo.IntRowId)
WHERE StAt.IntRowId > 0
 GROUP BY  StRzImRo.Rohstoff, StRo.Bezeichnung
-- GROUP BY  StRzImRo.Rohstoff, StRzImRo.Menge, StAt.PROD__REZEPTURGEWICHT, Coalesce(StRz.PARM__BEZUGSGROESSE,1)

Код полностью функционален и протестирован в IBSQL, но не работает в моем java-приложении. Мое приложение работает правильно с другим кодом. Я получаю эту ошибку:

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 266
ON

Я был бы очень рад, если бы кто-нибудь помог мне с этой проблемой. Спасибо! P.S.: Извините за мой плохой язык, но я не носитель языка


person Jacob    schedule 24.07.2013    source источник
comment
Возможно, вы захотите опубликовать код с запросом точно так же, как в вашем приложении Java. Ошибка предполагает, что в вашем запросе есть ON в неожиданном месте, и, поскольку сам запрос выглядит нормально, я предполагаю, что проблема заключается в том, как вы строите запрос в своем Java-приложении. В вашем запросе может отсутствовать пробел.   -  person Mark Rotteveel    schedule 24.07.2013
comment
Спасибо за помощь! Да, в моем java-приложении отсутствовал пробел позади FROM BwLsImAt. Спасибо!   -  person Jacob    schedule 24.07.2013
comment
Я также разместил свой комментарий в качестве ответа   -  person Mark Rotteveel    schedule 24.07.2013


Ответы (1)


Ошибка предполагает, что в вашем запросе есть ON в неожиданном месте, и, поскольку сам запрос выглядит нормально, я предполагаю, что проблема заключается в том, как вы строите запрос в своем Java-приложении. В вашем запросе может отсутствовать пробел.

Я предполагаю, что у вас есть что-то вроде

query = "SELECT * " +
        "FROM table1" +
        "JOIN table2 ON " //.....

Отсутствующий пробел сделает SQL:

SELECT * FROM table1JOIN table2 ON ....

Для синтаксического анализатора это совершенно верно, пока он не встретит токен ON, который вызывает ошибку. Например, синтаксический анализатор определяет, что это SELECT с * (всеми) столбцами из table1JOIN с псевдонимом table2. Во время синтаксического анализа сервер не проверяет, существует ли таблица на самом деле, поэтому он не спотыкается о том, что table1JOIN не существует. Это проверяется после успешного завершения синтаксического анализа.

person Mark Rotteveel    schedule 24.07.2013