现有数据结构如下,共120万条记录
地市 id 号码
成都 102013930803 1898171
凉山 349900658468 1898153
宜宾 319027652344 1800810
成都 102006797673 1337810
成都 102013632037 1530804
攀枝花 125001121844 1333071
成都 102011126708 1334893
成都 102014739968 1530809 需求如下:将号码随机排列后,把结果分别输出到24个txt,每个txt有5万个号码。

解决方案 »

  1.   

    select * from (select *, rownum as rn from table_name) where rn <= 50000;
    后面就调整 rn 就可以了
      

  2.   

    select * from (select *, rownum as rn from table_name) where rn between 1 and 50000;
    select * from (select *, rownum as rn from table_name) where rn between 50001 and 100000;.......--当然可以用动态的SQL拼接起来,然后一次运行!
      

  3.   

    可以写一存储过程,示例代码如下:-- 将指定数据表中的记录随机打乱后,存储指定个数的txt文件中,文件名的前缀可指定
    -- 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;
      

  4.   

    首先很感谢你的答复,我最终自己解决了;
    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',需要复制数据的数据源文件 
      

  5.   

    v_file_handle变量没用到。。需要在fileopen的时候用么?