bonjour,

Quelqu'un peut-il m'expliquer pourquoi la fonction position de DB2 ne me retourne pas ce qu'il faudrait quand je la met dans un PreparedStatement.

NB : IBMREQD et sysibm.sysdummy1 c'est pour l'exemple, pour prendre quelque chose de standard. Dans mon code '?' peut etre chaine vide ou toute autre chaine.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PreparedStatement prepareStatement = con.prepareStatement("select
position(? in IBMREQD using OCTETS) as pos from sysibm.sysdummy1");
 
prepareStatement.setString(1,"");
 
ResultSet resultSet = prepareStatement.executeQuery();
while (resultSet.next())
{
	System.out.println(resultSet.getInt("pos"));
}
 
 
com.ibm.db2.jcc.am.mo: DB2 SQL Error: SQLCODE=-418, SQLSTATE=42610,
SQLERRMC=null, DRIVER=4.7.85
	at com.ibm.db2.jcc.am.dd.a(dd.java:676)
	at com.ibm.db2.jcc.am.dd.a(dd.java:60)
	at com.ibm.db2.jcc.am.dd.a(dd.java:127)
	at com.ibm.db2.jcc.am.nm.c(nm.java:2493)
	at com.ibm.db2.jcc.am.nm.d(nm.java:2470)
	at com.ibm.db2.jcc.am.nm.a(nm.java:1950)
	at com.ibm.db2.jcc.t4.db.g(db.java:139)
	at com.ibm.db2.jcc.t4.db.a(db.java:39)
	at com.ibm.db2.jcc.t4.t.a(t.java:32)
	at com.ibm.db2.jcc.t4.sb.h(sb.java:135)
	at com.ibm.db2.jcc.am.nm.gb(nm.java:1921)
	at com.ibm.db2.jcc.am.om.kc(om.java:2806)
	at com.ibm.db2.jcc.am.om.b(om.java:3525)
	at com.ibm.db2.jcc.am.om.Xb(om.java:670)
	at com.ibm.db2.jcc.am.om.executeQuery(om.java:640)
	at jdbc.connectDB(jdbc.java:49)
	at jdbc.main(jdbc.java:14)
J'ai essayé aussi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
prepareStatement.setNull(1,Types.VARCHAR);
= meme chose


Si on tape la requete directement dans le terminal DB2, ca marche :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
db2inst1@dev01:~$ db2 "select position('' in IBMREQD using OCTETS) as pos
from sysibm.sysdummy1"                                                                                     
 
POS        
-----------
          1
 
  1 record(s) selected.


Si on fait ca dans le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
PreparedStatement prepareStatement = con.prepareStatement("select
position('' in IBMREQD using OCTETS) as pos from sysibm.sysdummy1");
sans paramètres, ça marche...
Strange, non?



J'ai essayé p6spy pour voir la transformation de la requete, ça la transforme bien comme ce que je tape dans le terminal DB2 et qui marche!!

Merci