现有数据结构如下,共120万条记录
地市 id 号码
成都 102013930803 1898171
凉山 349900658468 1898153
宜宾 319027652344 1800810
成都 102006797673 1337810
成都 102013632037 1530804
攀枝花 125001121844 1333071
成都 102011126708 1334893
成都 102014739968 1530809 需求如下:将号码随机排列后,把结果分别输出到24个txt,每个txt有5万个号码。
地市 id 号码
成都 102013930803 1898171
凉山 349900658468 1898153
宜宾 319027652344 1800810
成都 102006797673 1337810
成都 102013632037 1530804
攀枝花 125001121844 1333071
成都 102011126708 1334893
成都 102014739968 1530809 需求如下:将号码随机排列后,把结果分别输出到24个txt,每个txt有5万个号码。
后面就调整 rn 就可以了
select * from (select *, rownum as rn from table_name) where rn between 50001 and 100000;.......--当然可以用动态的SQL拼接起来,然后一次运行!
-- pFileName:文件名前缀
-- pFileNum:文件个数
-- pTable:表的名字
CREATE OR REPLACE PROCEDURE PushDataIntoFile(pTableName VARCHAR(20), pFileName VARHCAR(20), pFileNum NUMBER(2)) IS
DECLARE
URSOR curGetData(ppTableName) IS SELECT * FROM ppTableName ORDER BY DBMS_RANDOM.VALUE;
-- 每个文件的记录个数
vNumPerFile NUMBER(6);
-- 循环变量
vLoop NUMBER(6);
BEGIN
vLoop := 0;
vNumPerFile := 记录总数/pFileNum;
FOR r IN curGetData(pTableName)
LOOP
-- 将一条记录的内容写入到pFileName指定的文件中
vLoop := vLoop + 1;
IF vLoop % vNumPerFile = 0
-- 写入的文件名更换一下
END IF;
END LOOP;
END PushDataIntoFile;
sql>create or replace procedure mobile
( v_dir varchar2,
v_name varchar2)
as
v_file_handle utl_file.file_type;
v_count integer :=1;
begin
loop
utl_file.fcopy(v_dir,v_name,v_dir,to_char(v_count)||'.txt',(v_count-1)*50000+1,v_count*50000);
v_count:=v_count+1;
end loop;exception
when no_data_found then
null ;
end;
/
exec mobile('E:\SQL\','scchenmo.txt'); ------'E:\SQL\',文件所在路径 ; 'scchenmo.txt',需要复制数据的数据源文件