Pourquoi puis-je obtenir SQLCODE=-204, SQLSTATE=42704 avec DB2 LUW et WebSphere Application Server?

Il existe de nombreuses pages web où les gens montrent ce message comme un symptôme (avec la valeur après SQLERRMC et le niveau du pilote variables):

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

y compris plusieurs ici sur StackOverflow.

Les codes d'erreur signifie qu'un objet -- presque toujours une table -- n'est pas trouvé, et la valeur de la SQLERRMC paramètre contient le nom de l'objet en question. Dans tous les autres occurrence de ce que je peux trouver, la solution était juste qu'ils avaient besoin de qualifier le nom de la table avec le nom de schéma. Cependant, comme vous pouvez le voir à partir de la ligne ci-dessus, qui n'est pas le cas ici. Le schéma est M51Dev, et la table est CUSTOMER, et deux d'entre eux existent.

L'environnement WebSphere Application Server (7.0.0.31 dans ce cas particulier, mais j'ai quelque doute que c'est pertinent) en cours d'exécution sur Windows Server 2003 R2, avec DB2 9.7.300.3885 sur une vieille machine XP. La source de données est définie en A et récupéré via JNDI. l'application est écrite en Java, et notre SQL est exécutée à l'aide de JDBC via du Printemps JdbcTemplates.

La source de données définition en a ÉTÉ inclut une propriété personnalisée appelé currentSchema, qui est fixé à M51Dev.

C'est la ligne de SQL (ou l'un d'entre eux, nous obtenons le même symptôme pour chaque table):

SELECT rundateOverride  FROM customer WHERE customerId=1

Et voici un extrait de la trace de la pile. Je peux fournir plus si ça aide.

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

Tout comme certains d'arrière-plan: c'est une application bancaire qui prend en charge plusieurs plateformes de base de données. Nous avons des années d'expérience avec l'aide de différentes versions d'Oracle, MS SQL Server et DB2 pour le Système i; mais nous sommes relativement nouveau à l'utilisation de DB2 LUW. Encore, certains de mes collègues ont la configuration ci-dessus fonctionne, au moins quand ils ont ÉTÉ et DB2 sur la même machine.

Et je peux courir un client SQL sur la machine qui a ÉTÉ, et de se connecter à la base de données en question, avec les mêmes paramètres de requête et avec succès, y compris à l'aide de SET SCHEMA M51Dev et de ne pas qualifier les noms de table, qui, je pense, le plus étroitement émule le JDBC/environnement JNDI.

Ressemble le serveur d'applications utilise un identificateur entre guillemets lors de la définition du schéma: quelque chose le long des lignes de set schema "M51Dev" par opposition à set schema M51Dev. Voir si l'alimentation est le nom du schéma en majuscules aide.
Que sons réalistes, parce que si vous n'utilisez pas "'s, puis DB2 automatiquement roule tous les identificateurs de majuscules.
Merci. Je vais essayer ça quand je suis de retour au travail demain. Je serai surpris si il fonctionne. Légèrement gêné, trop, cependant.
Qui était-il! Oh, j'aurais essayé. @mustaccio, aimeriez-vous ajouter comme une réponse, et je vais l'accepter?

OriginalL'auteur Martin McCallion | 2014-06-10