oracle海量数据如何导出成多个文本文件?

时间:2022-10-25 07:55:13
oracle,一张表里的数据有亿条,请问如何将这些数据导出成一个一个的文本文件?

9 个解决方案

#1


参考:
Oracle数据直接导出到文本文件的方法
http://www.builder.com.cn/2007/1005/536616.shtml

#2


我不想将这么多数据导成一个文件,因为一个文件太大了打不开,有没有好的办法导成多个文本(.txt)文件?

#3


你修改一哈查询的地方就是了,一次导出一部分数据麻
循环来执行就是了

#4


占位学习

#5


参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以存储的记录数
  L_FILENO  INT DEFAULT 1;
BEGIN

  FOR I IN L_V LOOP
    IF MOD(L_NUM, L_MAXSIZE) = 0 THEN
      IF L_FILENO > 0 THEN
        UTL_FILE.FCLOSE(L_F);
      END IF;
      L_F      := UTL_FILE.FOPEN('TEST',
                                 'xx' || L_FILENO || '.txt',
                                 'w',
                                 32767);
      L_FILENO := L_FILENO + 1;
    END IF;
    UTL_FILE.PUT_LINE(L_F, I.VIEW_NAME || ',' || I.TEXT_LENGTH);
    L_NUM := L_NUM + 1;
  END LOOP;
  UTL_FILE.FCLOSE(L_F);
END;
/



引用楼主 bbqqqbq 的帖子:
oracle,一张表里的数据有亿条,请问如何将这些数据导出成一个一个的文本文件?

#6


引用 5 楼 oracledbalgtu 的回复:
SQL code参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以存储的记录数
  L_FILENO  INT DEFAULT 1;
BEGIN

  FOR I IN L_V LOOP
    IF MOD(L_NUM, L_MAXSIZE) = 0 THEN
      IF L_FILENO > 0 THEN
        UTL_FILE.FCLOSE(L_F);
      END IF;
   …


学习了,可惜没有海量数据,无法实践了!

#7


引用 5 楼 oracledbalgtu 的回复:
SQL code参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以存储的记录数
  L_FILENO  INT DEFAULT 1;
BEGIN

  FOR I IN L_V LOOP
    IF MOD(L_NUM, L_MAXSIZE) = 0 THEN
      IF L_FILENO > 0 THEN
        UTL_FILE.FCLOSE(L_F);
      END IF;
   …


不好意思,这几天才把数据导进去
数据量是1亿多条,我就一张表users,一个字段username(主键)
现在要把这些数据导成多个文本文件,按照一楼的意思我写成这样执行:
sool d:\d.txt
set heading off
set feedback off
select username from users where rownum<10000;
spool off;
将上面的代码在sql plus上执行
后来我发现有几个问题:
第一:select username from users where rownum<10000;与select username from users where rownum<100;这两条语句查出来的前一百条数据根本上就对不上,不是一样的,也就是说到时我循环导出时,修改rownum<10000中值的大小时,这样导出来的数据有可以是重复的;
第二:这个循环怎么写啊,生成不同的文件
5楼的那些语句能不能做个注释啊?看不懂

#8


刚没仔细看,觉得挺吓人的,仔细看了一下,还是看懂了。。。
这个循环,我电脑不会卡死吧?我还不敢执行

#9


引用 5 楼 oracledbalgtu 的回复:
SQL code
参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以……

L_FILENO  的默认值应该是0吧。

#1


参考:
Oracle数据直接导出到文本文件的方法
http://www.builder.com.cn/2007/1005/536616.shtml

#2


我不想将这么多数据导成一个文件,因为一个文件太大了打不开,有没有好的办法导成多个文本(.txt)文件?

#3


你修改一哈查询的地方就是了,一次导出一部分数据麻
循环来执行就是了

#4


占位学习

#5


参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以存储的记录数
  L_FILENO  INT DEFAULT 1;
BEGIN

  FOR I IN L_V LOOP
    IF MOD(L_NUM, L_MAXSIZE) = 0 THEN
      IF L_FILENO > 0 THEN
        UTL_FILE.FCLOSE(L_F);
      END IF;
      L_F      := UTL_FILE.FOPEN('TEST',
                                 'xx' || L_FILENO || '.txt',
                                 'w',
                                 32767);
      L_FILENO := L_FILENO + 1;
    END IF;
    UTL_FILE.PUT_LINE(L_F, I.VIEW_NAME || ',' || I.TEXT_LENGTH);
    L_NUM := L_NUM + 1;
  END LOOP;
  UTL_FILE.FCLOSE(L_F);
END;
/



引用楼主 bbqqqbq 的帖子:
oracle,一张表里的数据有亿条,请问如何将这些数据导出成一个一个的文本文件?

#6


引用 5 楼 oracledbalgtu 的回复:
SQL code参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以存储的记录数
  L_FILENO  INT DEFAULT 1;
BEGIN

  FOR I IN L_V LOOP
    IF MOD(L_NUM, L_MAXSIZE) = 0 THEN
      IF L_FILENO > 0 THEN
        UTL_FILE.FCLOSE(L_F);
      END IF;
   …


学习了,可惜没有海量数据,无法实践了!

#7


引用 5 楼 oracledbalgtu 的回复:
SQL code参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以存储的记录数
  L_FILENO  INT DEFAULT 1;
BEGIN

  FOR I IN L_V LOOP
    IF MOD(L_NUM, L_MAXSIZE) = 0 THEN
      IF L_FILENO > 0 THEN
        UTL_FILE.FCLOSE(L_F);
      END IF;
   …


不好意思,这几天才把数据导进去
数据量是1亿多条,我就一张表users,一个字段username(主键)
现在要把这些数据导成多个文本文件,按照一楼的意思我写成这样执行:
sool d:\d.txt
set heading off
set feedback off
select username from users where rownum<10000;
spool off;
将上面的代码在sql plus上执行
后来我发现有几个问题:
第一:select username from users where rownum<10000;与select username from users where rownum<100;这两条语句查出来的前一百条数据根本上就对不上,不是一样的,也就是说到时我循环导出时,修改rownum<10000中值的大小时,这样导出来的数据有可以是重复的;
第二:这个循环怎么写啊,生成不同的文件
5楼的那些语句能不能做个注释啊?看不懂

#8


刚没仔细看,觉得挺吓人的,仔细看了一下,还是看懂了。。。
这个循环,我电脑不会卡死吧?我还不敢执行

#9


引用 5 楼 oracledbalgtu 的回复:
SQL code
参考如下方法:
DECLARE
  CURSOR L_V IS
    SELECT VIEW_NAME, S.TEXT_LENGTH FROM USER_VIEWS S;
  L_F       UTL_FILE.FILE_TYPE;
  L_NUM     INT DEFAULT 0;
  L_MAXSIZE INT DEFAULT 5000; --每个文件可以……

L_FILENO  的默认值应该是0吧。