有一个比较BT的很长的SQL文。 不知道是哪位大神写出来的。
在测试时发现一下的问题:
①检索结果里面有8条数据, 把执行完的SQL文用statement直接执行。
得到的结果SUM(DEL_FLAG)是1.
②把sql文中设置参数的地方换成“?”,把参数和sql设置到preparedstatement,再执行preparedstatement.executeQuery()执行sql,检索结果SUM(DEL_FLAG)是16.检索结果是SUM(DEL_FLAG),是想看一下DB中被删除掉的数据有多少条。
正确的结果应该是一条。即8条数据中,有一条被删除了。把sql文放在osqledit中执行是1, 但是用preparedstatement检索结果竟然变成了16.首先保证。 2次执行的sql文完全一致,设置参数完全一致。 区别就是,一个是设置完参数的。一个是sql里面是?的想请教一下大家,preparedstatement和statement在什么情况下会发生检索结果不一致?
跟sql文有关么? 好明确一下调查方向。 现在完全是迷惑的状态啊。
在测试时发现一下的问题:
①检索结果里面有8条数据, 把执行完的SQL文用statement直接执行。
得到的结果SUM(DEL_FLAG)是1.
②把sql文中设置参数的地方换成“?”,把参数和sql设置到preparedstatement,再执行preparedstatement.executeQuery()执行sql,检索结果SUM(DEL_FLAG)是16.检索结果是SUM(DEL_FLAG),是想看一下DB中被删除掉的数据有多少条。
正确的结果应该是一条。即8条数据中,有一条被删除了。把sql文放在osqledit中执行是1, 但是用preparedstatement检索结果竟然变成了16.首先保证。 2次执行的sql文完全一致,设置参数完全一致。 区别就是,一个是设置完参数的。一个是sql里面是?的想请教一下大家,preparedstatement和statement在什么情况下会发生检索结果不一致?
跟sql文有关么? 好明确一下调查方向。 现在完全是迷惑的状态啊。
statement每次执行都会对SQL做分析,而preparedstatement对相同的SQL只做一次分析,
所以很明显preparedstatement对批量执行可以提升效率,但结果应该都是一样的,
所以估计应该是你那参数传递的问题
2、preparedstatement表示预编译的SQL语句的对象,SQL语句被预编译并存储在对象中,被封住的SQL语句代表某一类操作。在使用preparedstatement对象执行SQL命令时,SQL命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个preparedstatement对象时,他就会被在解析一次,但不会被再次编译。
3、在使用statement之前,拼写SQL语句时,如若不慎,参数值含有“””、“‘”和“,”等特殊字符时,该SQL语句就是非法的。但是preparedstatement是将参数值和SQL语句分开的,即时有特殊字符也能正确执行。
4、根据以上分析得出,应该是与参数有关系。
statement每次执行都会对SQL做分析,而preparedstatement对相同的SQL只做一次分析,所以很明显preparedstatement对批量执行可以提升效率,但结果应该都是一样的,
preparedstatement一次编译后在内存中就不会消失,而statement每次都要编译
很显然,你认为是数据库或者是 JDBC 驱动有 BUG。这么跟你说吧,如果数据库或者 JDBC 出现这种低级 BUG 的话,那数据库厂商 100% 是混不下去了。先从自己的代码找原因,再从两次执行的上下文中找原因,比如第一次执行时数据表中有 100 条数据,第二次执行时数据表中只有 80 条数据,那两次执行的结果肯定是不一样的!