Waarom krijg ik SQLCODE=-204, SQLSTATE=42704 met DB2 LUW en WebSphere App Server?

Er zijn talloze webpagina’s waar mensen dit bericht als symptoom tonen (met de waarde na SQLERRMCen het stuurprogrammaniveau varieert):

DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=M51Dev.CUSTOMER, DRIVER=3.61.65

waaronder verschillende hierop StackOverflow.

De foutcodes betekenen dat een object — bijna altijd een tabel — niet wordt gevonden, en de waarde van de parameter SQLERRMCbevat de naam van het betreffende object. Bij elke andere gebeurtenis die ik kan vinden, was de oplossing alleen dat ze de tabelnaam moesten kwalificeren met de schemanaam. Zoals u kunt zien aan de bovenstaande regel, is dat hier echter niet het geval. Het schema is M51DEVen de tabel is CUSTOMER, en beide bestaan.

De omgeving is WebSphere Application Server (7.0.0.31 in dit specifieke geval, maar op de een of andere manier betwijfel ik of dat relevant is) draaiend op Windows Server 2003 R2, met DB2 9.7.300.3885 op een oude XP-machine. De databron wordt gedefinieerd in WAS en opgehaald via JNDI. de applicatie is geschreven in Java en onze SQL wordt uitgevoerd met JDBC via Spring’s JdbcTemplates.

De gegevensbrondefinitie in WAS bevat een aangepaste eigenschap met de naam currentSchema, die is ingesteld op M51DEV.

Dit is de relevante SQL-regel (of een ervan, aangezien we voor elke tabel hetzelfde symptoom krijgen):

SELECT rundateOverride  FROM customer WHERE customerId=1

En hier is een uittreksel uit het stapelspoor. Ik kan meer leveren als het helpt.

bad SQL grammar [SELECT rundateOverride  FROM customer WHERE customerId=1]; nested exception is com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=M51Dev.CUSTOMER, DRIVER=3.61.65
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:233)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:406)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:455)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:463)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:471)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:476)
    at com.misys.meridian.runtime.userPromptable.SchedulerService.refreshMarketCentreSystemDates(SchedulerService.java:1539)
    at com.misys.meridian.runtime.userPromptable.SchedulerService.performService(SchedulerService.java:270)
    at com.misys.meridian.runtime.userPromptable.SchedulerService.prompt(SchedulerService.java:175)
    at com.misys.meridian.runtime.userPromptable.GenericDelegate.process(GenericDelegate.java:95)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:333)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:223)
    at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
    at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:117)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:117)
    at org.apache.camel.processor.Pipeline.access$100(Pipeline.java:43)
    at org.apache.camel.processor.Pipeline$1.done(Pipeline.java:135)
    at org.apache.camel.processor.ThreadsProcessor$ProcessCall.run(ThreadsProcessor.java:56)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:450)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
    at java.util.concurrent.FutureTask.run(FutureTask.java:149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:906)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:929)
    at java.lang.Thread.run(Thread.java:761)
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=M51Dev.CUSTOMER, DRIVER=3.61.65
    at com.ibm.db2.jcc.am.ed.a(ed.java:676)
    at com.ibm.db2.jcc.am.ed.a(ed.java:60)
    at com.ibm.db2.jcc.am.ed.a(ed.java:127)
    at com.ibm.db2.jcc.am.gn.c(gn.java:2554)
    at com.ibm.db2.jcc.am.gn.d(gn.java:2542)
    at com.ibm.db2.jcc.am.gn.a(gn.java:2034)
    at com.ibm.db2.jcc.t4.cb.g(cb.java:140)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:40)
    at com.ibm.db2.jcc.t4.q.a(q.java:32)
    at com.ibm.db2.jcc.t4.rb.i(rb.java:135)
    at com.ibm.db2.jcc.am.gn.gb(gn.java:2005)
    at com.ibm.db2.jcc.am.gn.a(gn.java:3023)
    at com.ibm.db2.jcc.am.gn.a(gn.java:667)
    at com.ibm.db2.jcc.am.gn.executeQuery(gn.java:651)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.executeQuery(WSJdbcStatement.java:999)
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:440)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:395)
    ... 40 more

Net als wat achtergrondinformatie: dit is een banktoepassing die meerdere databaseplatforms ondersteunt. We hebben er jarenlange ervaring mee in verschillende versies van Oracle, MS SQL Server en DB2 for System i; maar we zijn relatief nieuw in het gebruik van DB2 LUW. Toch hebben sommige van mijn collega’s de bovenstaande configuratie werkend, tenminste als ze WAS en DB2 op dezelfde machine hebben.

En ik kan een SQL-client uitvoeren op de machine die WAS heeft en verbinding maken met de betreffende database met dezelfde parameters en deze met succes opvragen, inclusief het gebruik van SET SCHEMA M51Deven het niet kwalificeren van de tabel namen, die volgens mij de JDBC/JNDI-omgeving het dichtst benaderen.


Antwoord 1, autoriteit 100%

Het antwoord is hoofdlettergevoeligheid.

Dit antwoord is in feite gegeven door mustaccioin een commentaar, maar ze lijken niet te wilt toevoegen als antwoord. Als je dit ziet, @mustaccio, voeg dan je eigen antwoord toe, zodat ik het kan accepteren.

Hoe dan ook, het blijkt dat WAS effectief aanhalingstekens lijkt te plaatsen rond de waarden die u opgeeft in de sectie “Aangepaste eigenschappen”. Ik had M51DEVingevoerd voor de eigenschap currentSchemaen deze werd naar DB2 gestuurd als "M51Dev". Maar DB2 had de schemanaam opgeslagen als M51DEVHet ziet die natuurlijk als twee verschillende waarden..

Het specificeren van M51DEVvoor de eigenschapswaarde loste het probleem op.

Other episodes