朋友要将一个表的一个列更新为2010年-2012年之间的随即日期。
采用的语句如下:
update a set datecol=(select trunc(sysdate,'yyyy')+dbms_random.value(-730,365) from dual);
但是这个语句却将日期更新为同一日期。
- SQL> update a set datecol=(select trunc(sysdate,'yyyy')+dbms_random.value(-730,365) from dual);
- 12 rows updated.
- SQL> select * from a;
- datecol
- -------------------
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 2011/11/04 03:57:41
- 12 rows selected.
这个问题是由于子查询缓存引起的,对于形如SELECT SUB_QUERY ,UPDATE WHERE SUB_QUERY之类的
子查询,oracle为了提高性能,只会执行一次。
如下:
- SQL> select trunc(sysdate,'yyyy')+dbms_random.value(-730,365) ,(select trunc(sysdate,'yyyy')+dbms_random.value(-730,365) from dual) a from a;
- TRUNC(SYSDATE,'YYYY A
- ------------------- -------------------
- 2012/03/11 17:58:58 2011/05/11 17:13:07
- 2011/06/07 03:53:56 2011/05/11 17:13:07
- 2012/05/16 20:35:21 2011/05/11 17:13:07
- 2011/11/16 05:22:42 2011/05/11 17:13:07
- 2010/06/07 10:33:11 2011/05/11 17:13:07
- 2010/04/08 17:36:28 2011/05/11 17:13:07
- 2010/01/17 09:10:41 2011/05/11 17:13:07
- 2012/09/23 20:03:54 2011/05/11 17:13:07
- 2011/08/20 08:36:53 2011/05/11 17:13:07
- 2010/05/06 19:06:37 2011/05/11 17:13:07
- 2010/06/08 02:08:31 2011/05/11 17:13:07
- TRUNC(SYSDATE,'YYYY A
- ------------------- -------------------
- 2011/07/07 22:46:33 2011/05/11 17:13:07
- 12 rows selected.
正确的修改方法应该采用如下的方式:
- SQL> update a set datecol= trunc(sysdate,'yyyy')+dbms_random.value(-730,365);
- 12 rows updated.
- SQL> select * from a;
- datecol
- -------------------
- 2012/09/24 09:08:39
- 2010/08/08 20:43:52
- 2011/06/04 14:13:52
- 2010/11/05 16:59:39
- 2010/11/27 06:49:07
- 2010/02/10 06:12:53
- 2011/09/02 21:18:47
- 2010/11/17 13:55:13
- 2011/10/22 09:37:32
- 2011/08/30 00:24:44
- 2011/02/06 05:54:38
- 2012/07/15 03:10:49
- 12 rows selected.
阅读(2358) | 评论(0) | 转发(0) |