2017-06-26 26 views
1

例子:如果下面的查询如何将表的每个记录加载到单独的文件?

Select * from emp; 

撷取的30个记录.. 输出为:

EMPNO ENAME JOB  MGR  HIREDATE SAL  COMM DEPTNO 

7499  ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 

7521  WARD SALESMAN 7698 22-FEB-81 1250 500 30 

.....(more 28 records)........ 

的每个记录应当与文件名称为 'Empno.Ename'

被保存在一个单独的文件
+0

的问题是具有标记'linux','unix'和'ksh',所以我发布了一个'awk'解决方案;如果解决方案必须在(PL /)SQL中完全执行,那么应该更新这个帖子来说明这一点(并且删除'linux' /'unix' /'ksh'标签) – markp

回答

1

,你需要做以下

  1. 创建的n个文件,因为你希望每个记录通过所有的记录
  2. 保存在自己的文件从每个记录中的数据被保存在自己的

  3. 运行的每一个文件并关闭该文件

    DECLARE 
    file_name VARCHAR2(30) := NULL; 
    out_file UTL_FILE.file_type; 
    dir_path VARCHAR2(100) := NULL; -- Give the directory alias, where you want to store file 
    BEGIN 
    
    FOR record IN 
    (
        SELECT * 
        FROM emp 
    ) 
    LOOP 
        file_name := TO_CHAR(record.empno) || '.' || TO_CHAR(record.ename); 
        out_file := UTL_FILE.fopen (i_chr_dir_path, file_name, 'W', 32767); 
        UTL_FILE.put_line(out_file, record.empno || ',' || record.ename || ',' || record.job 
        -- more fields 
        ); 
    
        IF UTL_FILE.is_open (out_file) THEN 
         UTL_FILE.fclose (out_file); 
    
        END IF; 
    
    END LOOP; 
    END; 
    
+0

您现在可以更新它以反映已添加要求文件名的格式为'Empno.Ename' –

+0

@TonyAndrews \t –

1

以下是其中一个选项。您只需为表中的每一行生成一个带有select语句的文件,然后执行它。

在这里,我有一个名为T1的表,其中包含7条记录。该文件(让我们将其命名为tabletofiles.sql)看起来是这样的:

set feedback off; 
set termout off; 
set heading off; 
set verify off; 
set sqlblanklines on; 

# temp file with statements 
spool /tmp/tmpfile.sql 

# specify column names you want to fetch explicitly 
select 'spool /tmp/file_' || to_char(rownum) || ';' || chr(10) || 
     'select c1 
      from (select q.* 
         , rownum as rn 
        from &1 q) 
      where rn = ' || to_number(rownum) || ';' || 
     chr(10) || 'spool off;' 
    from &1; 

spool off; 

@@tmpfile.sql 
#clean up after ourselfs 
!rm -I /tmp/tmpfile.sql 

通表名作为参数

SQL> @/tmp/tabletofiles.sql t1 

执行完成tmpfile.sql后包含以下内容:

spool /tmp/file_1; 
select c1 
      from (select q.* 
         , rownum as rn 
        from t1 q) 
      where rn = 1; 
spool off; 

spool /tmp/file_2; 
select c1 
      from (select q.* 
         , rownum as rn 
        from t1 q) 

      where rn = 2; 
spool off; 

。 ..

每个结果select语句被卷入不同的文件。

这里是我们的最后文件:

82 Jun 26 11:28 file_1.lst 
82 Jun 26 11:28 file_2.lst 
82 Jun 26 11:28 file_3.lst 
82 Jun 26 11:28 file_4.lst 
82 Jun 26 11:28 file_5.lst 
82 Jun 26 11:28 file_6.lst 
82 Jun 26 11:28 file_7.lst 
1

假设:

  • 忽略列标题
  • 对于一个给定emp记录的所有数据驻留在同一行的第一行(例如, ,数据中没有嵌入式回车,数据不跨越多行)
  • 测试数据位于名为emp.raw的文件中
  • awk是一个有效的选项(OP被标记有linuxunixksh

样品EMP的含量的影响。原料:

EMPNO ENAME JOB   MGR  HIREDATE SAL  COMM DEPTNO 
7499  ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 
7521  WARD SALESMAN 7698 22-FEB-81 1250 500 30 

A 1行awk溶液:

$ awk '!/^EMPNO/ { print > $1"."$2}' emp.raw 

和结果:

$ ls -1 
7499.ALLEN 
7521.WARD 
emp.raw 

$ for f in 7* 
> do 
> echo "+++++++++++++ $f" 
> cat $f 
> done 
+++++++++++++ 7499.ALLEN 
7499  ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 
+++++++++++++ 7521.WARD 
7521  WARD SALESMAN 7698 22-FEB-81 1250 500 30 
+0

数据来自数据库表而不是文件:) –

+0

@SudiptaMondal:当然,数据来自数据库表,但在有些点可以将数据写入文件;或者'select'的输出可以传送到'awk'解决方案中;如果OP需要纯粹的(PL /)SQL解决方案,那么应该将其添加到帖子中 – markp

相关问题