SQL-запрос Firebird со знаком @ (at) — Как выполнить запрос в JDBC (Jaybird)?

У меня есть приложение, использующее Firebird. Приложение выполняет длинный список запросов, например. каждый раз, когда вы перечисляете свои предметы. Я хочу удалить эти запросы и запустить их в своем собственном Java-приложении (чтобы я мог манипулировать списком, отображать его и т. д.).

Проблема в том, что в приложении есть опция отладки, где вы можете увидеть, какие запросы выполняет ваше приложение. Некоторые из исходных запросов получили знаки @. Если я запускаю запрос с @, я получаю сообщение об ошибке. Если я уберу эту часть запроса, все запустится и будет работать "как положено". Никаких ошибок, как шарм.

Подробное сообщение об ошибке:
Код ошибки: -104
Неизвестный токен — строка 8, столбец 32.

Мы используем IntelliJ IDEA, который при необходимости автоматически применяет escape-символы.
Такая часть исходного запроса:

SELECT  TBL4487."Id" "database.id",
       TBL4487."Code" "database.code",
       TBL4487."Name" "database.name",
       TBL4487."Barcode" "database.barcode",
       TBL4488."Name" "Datagroup",
       TBL4489."Name" "Mey",
       (SELECT FIRST 1   TBL4494."Price" / (CASE
    WHEN (TBL4487."GrossPrices" = @Param4495) THEN 1
    ELSE (TBL4492."Rate" + 100) / 100
END) "productprice.price"
FROM "ProductPrice" TBL4494
WHERE (TBL4494."Product" = TBL4487."Id") AND (TBL4494."PriceCategory" = @Param4497) AND (TBL4494."ValidFrom" <= @Param4498) AND (TBL4494."Currency" = @Param4499) AND (TBL4494."QuantityUnit" = TBL4487."QuantityUnit")
ORDER BY TBL4494."ValidFrom" DESC) "xyz",
       (SELECT FIRST 1   TBL4500."Price" / (CASE
    WHEN (TBL4487."GrossPrices" = @Param4501) THEN 1
    ELSE (TBL4492."Rate" + 100) / 100

Вопрос в том, как я могу запустить этот запрос? Как заменить символ @?


person Apache    schedule 04.01.2013    source источник
comment
Если кому интересно, можете логировать запросы с помощью Firebird Scanner. Это проприетарно и прочее, но, по крайней мере, вы можете видеть точные запросы, которые вы можете реализовать в коде позже. (Не такой гибкий, но если вам нужно несколько запросов максимум, он работает отлично.)   -  person Apache    schedule 18.04.2013


Ответы (1)


Вы не можете запустить этот запрос напрямую с помощью Jaybird. Эти @ParamXXXX кажутся заполнителями в запросе параметров. Однако ни Firebird, ни Jaybird не поддерживают этот тип заполнителей (они поддерживают только ? в качестве заполнителя в DSQL).

Чтобы выполнить это с Jaybird, вам нужно будет заменить каждый экземпляр @ParamXXXX либо на ? и установить правильное значение для каждого заполнителя в PreparedStatement, либо на фактическое значение в самом тексте запроса.

Поставщик Firebird .NET поддерживает заполнители в стиле @.... (он переводит их в заполнители в стиле ? в стиле Firebird), поэтому вы можете попробовать вместо этого использовать C#/.NET, если не хотите заменять себя.

Полное раскрытие: я разработчик Jaybird

person Mark Rotteveel    schedule 05.01.2013
comment
Планируется ли какая-либо функция для принятия заполнителей параметров в Jaybird, таких как, например, .NET, который вы упомянули, или стиль :param, который вы можете использовать из компонентов Zeos или Delphi? - person Guillem Vicens; 05.01.2013
comment
@GuillemVicens Нет, нет планов поддерживать это: JDBC не предоставляет API для именованных параметров в запросах, которые заставят пользователей использовать интерфейс, специфичный для Jaybird, что, ИМХО, плохо, а сам Firebird не поддерживает именованные параметры, что означает дополнительную сложность в драйвере, чтобы анализировать параметры и сопоставлять их с позиционными заполнителями, и, наконец, мое время для работы над Jaybird ограничено, и IMO есть более важные вещи, которые нужно улучшить/добавить в Jaybird. - person Mark Rotteveel; 05.01.2013
comment
Вау, большое спасибо. Оба решения меня вполне устраивают, но я просто не могу понять параметры. Где я мог найти это? Просмотрел все запросы в приложении но нигде нет параметров. Я также посмотрел приложение FBscan, но оно не сработало (приложение написано на C#, с которым мне приходится работать, и оно работает с Firebird 2.1) || Я знаю, что этот бонус не является частью вопроса, спасибо за решение. Надеюсь, вы можете мне помочь. :) - person Apache; 05.01.2013
comment
@Shiki Если приложение не регистрирует фактические значения параметров, вам нужно будет найти их самостоятельно (хотя я не уверен в хороших инструментах для этого) - person Mark Rotteveel; 05.01.2013
comment
@MarkRotteveel - Спасибо за быстрый ответ. Мы это как-нибудь уладим. P.S.: Продолжайте в том же духе! - person Apache; 05.01.2013
comment
@MarkRotteveel, достаточно честно. С моей стороны было просто любопытство :-) - person Guillem Vicens; 05.01.2013