web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens SQLCODE = -204, SQLSTATE = 42704 avec DB2 LUW et WebSphere App Server?

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

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

dont plusieurs ici on StackOverflow .

Les codes d'erreur signifient qu'un objet - presque toujours une table - n'est pas trouvé, et la valeur du paramètre SQLERRMC contient le nom de l'objet en question. Dans toutes les autres occurrences de ce que je peux trouver, la solution était simplement qu'il fallait qualifier le nom de la table avec le nom du schéma. Cependant, comme vous pouvez le voir sur la ligne ci-dessus, ce n'est pas le cas ici. Le schéma est M51Dev, et la table est CUSTOMER, et les deux existent.

L'environnement est WebSphere Application Server (7.0.0.31 dans ce cas particulier, mais je doute que ce soit pertinent) fonctionnant sur Windows Server 2003 R2, avec DB2 9.7.300.3885 sur une ancienne machine XP XP. = La source de données est définie dans WAS et récupérée via JNDI. L'application est écrite en Java et notre SQL est exécuté à l'aide de JDBC via JdbcTemplates de Spring.

La définition de la source de données dans WAS inclut une propriété personnalisée appelée currentSchema, qui est définie sur M51Dev.

Il s'agit de la ligne SQL appropriée (ou de l'une d'entre elles, car 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 en fournir plus si cela 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 quelques informations: il s'agit d'une application bancaire qui prend en charge plusieurs plates-formes de bases de données. Nous avons des années d'expérience avec l'utilisation de différentes versions d'Oracle, MS SQL Server et DB2 pour System i; mais nous sommes relativement nouveaux dans l'utilisation de DB2 LUW. Pourtant, certains de mes collègues ont la configuration ci-dessus qui fonctionne, au moins quand ils ont WAS et DB2 sur la même machine.

Et je peux exécuter un client SQL sur la machine qui a WAS, et me connecter à la base de données en question avec les mêmes paramètres et l'interroger avec succès, y compris en utilisant SET SCHEMA M51Dev et sans qualifier les noms de table, ce qui, je pense, émule le plus fidèlement l'environnement JDBC/JNDI.

9
Martin McCallion

La réponse est la sensibilité à la casse.

Cette réponse a en fait été fournie par mustaccio dans un commentaire , mais ils ne semblent pas vouloir l'ajouter comme réponse. Si vous voyez cela, @mustaccio, veuillez ajouter votre propre réponse, afin que je puisse l'accepter.

Quoi qu'il en soit, il s'avère que WAS semble mettre efficacement des guillemets autour des valeurs que vous spécifiez dans la section "Propriétés personnalisées". J'étais entré M51Dev pour la propriété currentSchema, et elle était envoyée à DB2 en tant que "M51Dev". Mais DB2 avait stocké le nom du schéma sous la forme M51DEV Il les voit comme deux valeurs différentes, bien sûr ..

Spécification M51DEV pour la valeur de la propriété a résolu le problème.

13
Martin McCallion