使用PL/SQL可以读写文件,我们可以将查询的数据以一定格式写入文件中,当我们注意分割字段的方式,就可以将它转换成我们需要的格式!

首先我了解到将字段存入txt文件中,如果使用制表符分隔字段,将文件名后缀改为xls,我们就可以以Excel打开这个文本文件,并且是按照表格形式展现的;同样道理,如果我们使用逗号进行分隔,然后将后缀改为cvs,也会以Excel的CVS格式打开这个文件!

下面写一个例子:

1 首先写一个用于写文件的公共方法

使用PL/SQL的UTL_FILE写xls和csv格式文件(转)CREATE OR REPLACE PROCEDURE PROC_FILE_WRITE(
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  i_title           
VARCHAR2,
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  i_fileMsg      
VARCHAR2,
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  i_fileType     
VARCHAR2
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
IS
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  v_file             UTL_FILE.FILE_TYPE; 
--写入文件
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
  PATH            VARCHAR2(1024);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  v_fileName  
VARCHAR2(2048);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
BEGIN
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  PATH:
='TEST';
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  v_fileName:
=i_title||'.'||i_fileType;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
IF UTL_FILE.IS_OPEN(v_file) THEN
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)       UTL_FILE.FCLOSE(v_file);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
END IF;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  v_file :
= UTL_FILE.FOPEN(PATH, v_fileName, 'w');
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  UTL_FILE.PUT_LINE(v_file, i_fileMsg);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  UTL_FILE.FCLOSE(v_file);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)EXCEPTION
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
WHEN OTHERS THEN
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    DBMS_OUTPUT.PUT_LINE(SQLERRM);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    
IF UTL_FILE.IS_OPEN(v_file) THEN
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)       UTL_FILE.FCLOSE(v_file);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    
END IF;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
END PROC_FILE_WRITE;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
/
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)

2 创建文件生成路径

使用PL/SQL的UTL_FILE写xls和csv格式文件(转)CREATE OR REPLACE DIRECTORY  TEST AS 'C:TEST'

3 创建一个表并添加数据

使用PL/SQL的UTL_FILE写xls和csv格式文件(转)CREATE TABLE TEST_FILE_T(
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)ID         
NUMBER NOT NULL,
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)NAME   
VARCHAR(32),
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)AGE     
NUMBER,
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)SEX      
VARCHAR(2)
使用PL/SQL的UTL_FILE写xls和csv格式文件(转));
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
--数据自行填写

4 写文件

使用PL/SQL的UTL_FILE写xls和csv格式文件(转)CREATE OR REPLACE PROCEDURE PROC_OUT_FILE
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
AS
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  v_fileMsg 
VARCHAR2(30000);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
CURSOR get_file_cur IS
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    
SELECT id, name,age,sex 
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    
FROM test_file_t;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  get_file_rec get_file_cur
%ROWTYPE;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  vs_time     
VARCHAR2(16);
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
BEGIN
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  v_fileMsg :
= v_fileMsg || 'ID'|| chr(44||'NAME'||chr(44||'AGE'||chr(44||'SEX';
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
OPEN get_file_cur;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
SELECT TO_CHAR(sysdate, 'yyyymmddhhmiss'INTO vs_time FROM DUAL;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  LOOP
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    
FETCH get_file_cur
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)      
INTO get_file_rec;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    
EXIT WHEN get_file_cur%NOTFOUND;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)      
--转换成cvs,需要用逗号(chr(44))分隔字段,转换成xls,需要用制表符(chr(9))分隔字段,换行(chr(10))
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
      IF get_file_cur%ROWCOUNT=1 THEN
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)        v_fileMsg :
= v_fileMsg || 'ID'|| chr(44||'NAME'||chr(44||'AGE'||chr(44||'SEX';
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)      
END IF;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)      v_fileMsg :
= v_fileMsg || chr(10)||to_char( get_file_rec.id) || chr(44||
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)                    get_file_rec.name
||chr(44||to_char(get_file_rec.age)||chr(44||get_file_rec.sex;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    PROC_FILE_WRITE(
'file'||vs_time,v_fileMsg,'csv');
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
END LOOP;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
CLOSE get_file_cur;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)EXCEPTION
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)  
WHEN OTHERS THEN
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)    
NULL;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
END;
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)
/
使用PL/SQL的UTL_FILE写xls和csv格式文件(转)

按照上面所述,就可以将数据转换成想要的格式,需要注意的是:

1 上面只有xls和cvs的,如果有其他格式的规则,也可以转换;

2 需要对特殊字符进行转换,如分隔cvs的逗号,需要过滤查询结果里的逗号;

3 当我以ID起头拼的串,会报一个小问题,有兴趣的可以试一下,无意中发现的,有明白的朋友请指点一二,谢谢!

相关文章: