如何将ORACLE DB中约300个表中的数据导出到csv或txt文件

时间:2019-02-20 14:38:19

标签: oracle csv plsql export

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

您提出什么建议,这是最快的方法?目前,我不需要将这些导出的文件导入任何其他架构...

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

4 个答案:

答案 0 :(得分:0)

您可以尝试执行以下步骤。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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;

答案 3 :(得分:0)

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;
/