2015-04-20 4 views
2

Итак, у меня установлен Adobe ColdFusion 11 Update 5 на сервере Windows 2012. Я добавил источник данных Firebird с помощью JDBC-драйвера Jaybird 2.2.5. Я создал запрос, используя этот источник данных, как так:Ошибка запроса с использованием RDBMS Firebird с ColdFusion 11

<cfquery name="rawdata" datasource="RSReport"> 
    select * from rptpatientstudy 
    where statusorder >= 200 
    and issuer = 'RWHG' 
    and studydatetime >= '2015-01-01' 
    and studydatetime < '2015-04-01';  
</cfquery> 

, но когда я запускаю страницу, я получаю сообщение об ошибке динамического SQL упоминая неизвестный маркер.

Вот трассировки стека:

org.firebirdsql.gds.GDSException: Dynamic SQL Error 
SQL error code = -104 Token unknown - line 2, column 1 RETURNING 
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.readStatusVector(AbstractJavaGDSImpl.java:2092) 
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.receiveResponse(AbstractJavaGDSImpl.java:2042) 
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlPrepare(AbstractJavaGDSImpl.java:1465) 
at org.firebirdsql.gds.impl.GDSHelper.prepareStatement(GDSHelper.java:190) 
at org.firebirdsql.jdbc.AbstractStatement.prepareFixedStatement(AbstractStatement.java:1441) 
at org.firebirdsql.jdbc.AbstractStatement.internalExecute(AbstractStatement.java:1423) 
at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:867) 
at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:441) 
at coldfusion.server.j2ee.sql.JRunStatement.execute(JRunStatement.java:359) 
at coldfusion.sql.Executive.executeQuery(Executive.java:1479) 
at coldfusion.sql.Executive.executeQuery(Executive.java:1229) 
at coldfusion.sql.Executive.executeQuery(Executive.java:1159) 
at coldfusion.sql.SqlImpl.execute(SqlImpl.java:406) 
at coldfusion.tagext.sql.QueryTag.executeQuery(QueryTag.java:1185) 
at coldfusion.tagext.sql.QueryTag.startQueryExecution(QueryTag.java:814) 
at coldfusion.tagext.sql.QueryTag.doEndTag(QueryTag.java:767) 
at cfmarla2ecfm1504149200.runPage(C:\inetpub\WebSites\intranet\marla.cfm:1) 
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:246) 
at coldfusion.tagext.lang.IncludeTag.handlePageInvoke(IncludeTag.java:736) 
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:572) 
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65) 
at coldfusion.filter.IpFilter.invoke(IpFilter.java:45) 
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:466) 
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) 
at coldfusion.filter.PathFilter.invoke(PathFilter.java:142) 
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94) 
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) 
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) 
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:58) 
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) 
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) 
at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62) 
at coldfusion.CfmServlet.service(CfmServlet.java:219) 
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) 
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:422) 
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:199) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 

Вот список полей в таблице:

STUDYINSTANCEUID 
PATIENTID 
PATIENTNAME 
STUDYDATETIME 
STUDYDESCRIPTION 
PRIORITY 
READINGPHYSICIAN 
REFERINGPHYSICIAN 
PERFORMINGPHYSICIAN 
TECHNOLOGIST 
TRANSCRIPTIONIST 
ACCESSIONNUMBER 
INSTITUTIONNAME 
STATUSORDER 
SCHEDULEDBODYPARTEXAMINED 
SCHEDULEDMODALITY 
UTCOFFSET 
HL7BILLED 
SCHEDULEDEXAMROOM 
PATIENTBIRTHDATE 
MODALITIES 
BODYPARTS 
IMAGES 
AGE 
SEX 
CONFLICT 
STUDYID 
FILESETID 
ISSUER 
SCHEDULEDLATERALITY 
LOCATION 
PROCEDURECODE 
DATETIMEREAD 
DURATION 
FILM 
BURNCD 
MAIL 
COURIER 
AUTOFAXLIST 
AUTOEMAILLIST 
SCHEDULEDRESOURCE 
ACCOUNTSTATUS 
LANGUAGE 
FINANCIALTYPE 
STATE 
INSURANCEPAYERS 
INSURANCEEXPIRIES 
COMMENTS 
ALLERGIES 
CANCELLATIONREASON 
CELLPHONE 
HOMEPHONE 
AUTHORIZATIONNUMBER 
DATEOFSURGERY 
RECEIVEDTIME 
INTERNALVISITID 
SMOKINGSTATUS 

Я действительно не знаю, где это, возможно, пришли, и я могу» t, похоже, находит что-то непосредственно применимое к Google; большинство результатов, похоже, имеют дело с использованием производных таблиц или SELECT * в запросе.

+0

Были ли у вас успешные запросы с помощью этого источника данных? Кроме того, попробуйте удалить половину двоеточия. –

+0

Какая у вас версия Firebird? –

+0

@ DanBracuk Нет; запрос, который я представляю здесь, на самом деле является упрощенной версией первой, которую я пробовал, которая использовала INNER JOIN. –

ответ

3

TL; DR: Это ошибка в Jaybird. Я создал ошибку JDBC-391, и это было исправлено в Jaybird 2.2.8.

Метод execute, вызываемый в стеке, равен execute(String, int), который обычно вызывается только для обновления/вставки, который должен возвращать сгенерированные ключи. Похоже, Cold Fusion всегда называет это так (со значением Statement.RETURN_GENERATED_KEYS).

Реализация, которая обрабатывает сгенерированные ключи в Jaybird, предполагает, что ее внутренний синтаксический анализатор вызывает исключение при столкновении с оператором SELECT; если это произойдет, запрос должен обрабатываться без изменений. К сожалению, нет никакого теста для этого предположения, и парсер фактически не генерирует исключение, когда ошибки возникают во время разбора (они сигнализируются по-другому). В результате запрос SELECT изменяется путем добавления предложения RETURNING, который является синтаксической ошибкой, когда запрос затем отправляется на сервер.

Я не уверен, есть ли обходной путь для этого, за исключением, возможно, возврата к Jaybird 2.1.6, поскольку эта проблема существует с момента первоначальной реализации в Jaybird 2.2.0. Вы также можете проверить, имеет ли Cold Fusion конфигурацию, которая изменит способ выполнения запросов.

Это исправлено в Jaybird 2.2.8.

Раскрытие информации: Я являюсь одним из разработчиков Jaybird.

+0

Спасибо! Потрясающие! Я попробую отбросить версию Jaybird. –

+0

@MattGutting Я не совсем уверен, что если использовать 2.1.6, он исправит это, но может просто выбросить 'FBDriverNotCapableException'. Это зависит от того, проверяет ли Cold Fusion поддержку сгенерированных ключей перед вызовом этого метода. –

+0

@ MattGutting Jaybird 2.2.8 выпущен сегодня, для загрузки см. Https://github.com/FirebirdSQL/jaybird/releases/tag/v2.2.8 –