【问题标题】:how to export data from around 300 tables in ORACLE DB to csv or txt files如何将 ORACLE DB 中大约 300 个表中的数据导出到 csv 或 txt 文件
【发布时间】:2019-03-02 12:06:07
【问题描述】:

是否有可能使用任何 PL/SQL 过程将数据从单个模式中的大约 300 个表中包含数百万条记录导出到 CSV 或 TXT?

您有什么建议,哪种方式最快?目前我不需要将这些导出的文件导入到任何其他架构中......

我尝试使用 Toad 手动逐表导出...

【问题讨论】:

  • 我建议你看看 Tim Hall 的Oracle-Base article on this topic。他的csv.sql script 看起来像是可以用来驱动自动化解决方案的东西。
  • 您是否尝试过使用 toad 一次导出所有表格? (因为 toad 支持多个表导出)
  • @Plirkee .. 我害怕使用 toad,因为这些表中有很多数据,它随时可能崩溃。

标签: oracle csv plsql export


【解决方案1】:

您可以尝试以下步骤。

  1. 编写一个循环来获取表名
  2. 使用游标从每个表中获取数据
    1. 使用 SYS.UTL_FILE 实用程序将数据写入任何所需格式的文件。

这是一个非常高级的解决方案。但我相信它会起作用。

【讨论】:

    【解决方案2】:

    我创建了一个实用程序,您可以通过它生成 PL/SQL 过程以从表中导出数据。它将采用以下参数,表名、列名、目录名和分隔符。您可以立即为 50 个表生成 50 个过程以从 Oracle 导出数据。检查此链接Generate PL/SQL Procedure to export data into CSV

    【讨论】:

    • 将所有这些详细信息输入到您的网站中 50 - 更不用说 300 - 表 不会比使用 Toad 的导出实用程序更快。
    • 他的问题是使用 PL/SQL 过程来完成这项任务,这就是我建议的原因。他将来也可以使用这些存储过程。
    • @AfrimRexhepi 您能否在目录位置获取 CSV 文件?记住目录名在过程中应该大写...
    • @VinishKapoor 是的,我现在想通了.. 我得到了文件,一切都很好。但是为每个文件创建一个过程真的太多了..无论如何,对于代码来说!我可以将它用于其他目的。
    【解决方案3】:

    我设法动态遍历所有表并获取列名并写入文件。我正在努力在执行即时查询时如何动态地从表中获取数据行?我应该如何保存数据行而不是获取它并写入文件? 代码如下:

    DECLARE p_table        VARCHAR2 (100);
    l_file UTL_FILE.FILE_TYPE;
    l_string       VARCHAR2 (10000);
    query_string   VARCHAR2 (4000);
    BEGIN
    FOR tab IN (SELECT *
                 FROM dba_tables
                WHERE owner = 'XYZ' AND table_name LIKE 'XYZ%')
    LOOP
      p_table := tab.table_name;
    
      l_file :=
         UTL_FILE.FOPEN ('my_path',
                         tab.table_name || '.txt',
                         'w',
                         10000);
      l_string := NULL;
    
    
      FOR col_he IN (SELECT *
                       FROM dba_tab_columns
                      WHERE owner = 'DWHCO' AND table_name = p_table)
      LOOP
         CASE
            WHEN l_string IS NULL
            THEN
               l_string := col_he.column_name;
            ELSE
               l_string := l_string || ',' || col_he.column_name;
         END CASE;
      END LOOP;
    
      UTL_FILE.PUT_LINE (l_file, l_string);            --Printng table columns
    
      query_string := 'select ' || l_string || ' from DWHCO.' || p_table      
      --Execute immediate query_string into ??????????;
            --??????
      UTL_FILE.FCLOSE (l_file);  END LOOP;END;
    

    【讨论】:

      【解决方案4】:

      Data Dump 过程有助于以编程方式将许多表导出为简单格式,例如 CSV。

      首先,使用上面的链接安装包。下面的代码创建一个目录,循环遍历表,并将每个表导出为 CSV。

      create or replace directory temp_dir as 'C:\temp';
      
      begin
          for tables in
          (
              select
                  owner||'_'||table_name||'.csv' file_name,
                  'select * from "'||owner||'"."'||table_name||'"' v_sql
              from dba_tables
              where owner = 'XYZ'
                  and table_name like 'XYZ%'
              order by 1
          ) loop
              data_dump
              (
                  query_in        => tables.v_sql,
                  file_in         => tables.file_name,
                  directory_in    => 'TEMP_DIR',
                  delimiter_in    => ',',
                  header_row_in   => true
              );
          end loop;
      end;
      /
      

      【讨论】:

      • 这太棒了.. 非常感谢!
      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多