REF_VALUES是数据库表,ID是主键,ORIGINAL_VALUE是源列,将ORIGINAL_VALUE打乱次序后要更新到空列SHUFFLED_VALUE。部分数据如下:
SQL:
不同的数据库写法不同,以Oracle为例:
create or replace procedure shuffle as TYPE My_CurType IS REF CURSOR; CUR_1 My_CurType; V_id NUMBER(10,0); V_result varchar2(20); v_sql varchar2(2000); begin OPEN CUR_1 FOR select t1.id,t2.result from ( select rownum rn,id,ORIGINAL_VALUE from REF_VALUES order by ORIGINAL_VALUE) t1 join( select rownum rn,result from( select ORIGINAL_VALUE result from REF_VALUES order by dbms_random.value()))t2 on t2.rn=t1.rn; LOOP fetch CUR_1 INTO V_id,V_result ; EXIT WHEN CUR_1%NOTFOUND; v_sql:='update REF_VALUES set SHUFFLED_VALUE='''||V_result||''' where id='||V_id; EXECUTE immediate v_sql; END LOOP; CLOSE CUR_1; end shuffle;
计算出打乱次序的结果就需要多层嵌套子查询(前半部分),要再更新到表中还需要用游标(或者用临时表)及存储过程,整个代码非常繁琐。
使用集算器可以避免复杂的嵌套子查询,且可通用于各种数据库,代码如下:
A1:执行SQL,取得列id、ORIGINAL_VALUE。
A2:打乱A1的次序。
A3:将A1中的id列和A2中的ORIGINAL列拼成一个二维表。计算结果如下:
A4:用A3更新表REF_VALUES。选项@u表示只生成更新语句。更新后REF_VALUES如下: