Oracle数据库-关于读取文件路径的问题整理
Oracle中对文件的操作都要建立目录对象,目录对象实际是一种映射机制,目录对象是一种系统资源,需要由管理员创建,任何经过授权的用户都可以使用这个目录对象。目录对象本质上就是数据库对象对应一个实际磁盘目录路径。因为处于系统可移植性和管理方便考虑Oracle程序中对文件操作一般不使用实际的文件路径。
可以这样建立目录对象。首先在磁盘建立目录文件夹,然后管理员登录建立目录对象:
CREATE DIRECTORY TEST_DIR AS 'C:/DEVELOP';
目录对象的名称是 TEST_DIR ,代表的实际目录是C:/DEVELOP,注意DEVELOP是文件夹的名称,需要手动在对应位置建立,将来操作的文件都会在这个文件夹下。
如果SCOTT 用户要使用目录对象,则需要管理员进行如下授权:
GRANT READ,WRITE ON DIRECTORY TEST_DIR TO SCOTT;
SCOTT用户下,以下代码把所有部门信息写入名称为dept.xml的XML文件中:
DECLARE
result CLOB;--存放初始的XML信息
output_file UTL_FILE.FILE_TYPE;--文件对象
xmlstr VARCHAR2(32767);--存放XML
line VARCHAR2(2000);--存放一行XML
line_no INTEGER := 1;
BEGIN
--获取初始的XML,是CLOB数据
result := DBMS_XMLQuery.getXml('SELECT * FROM dept');
--获取大对象CLOB中文本信息,注意这里假设所有的XML信息不会超过32767
xmlstr := DBMS_LOB.SUBSTR(result,32767);
--UTL_FILE.FOPEN方法创建文件,返回文件对象
output_file := UTL_FILE.FOPEN('TEST_DIR','dept.xml','w');
LOOP
EXIT WHEN xmlstr IS NULL;
line := SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10))-1);
DBMS_OUTPUT.PUT_LINE(line_no || ':' || line);
--UTL_FILE.PUT写一行信息到文件
UTL_FILE.PUT(output_file,line || CHR(10));
xmlstr := SUBSTR(xmlstr,INSTR(xmlstr,CHR(10))+1);
line_no := line_no + 1;--行号增加
END LOOP ;
UTL_FILE.FCLOSE(output_file);--关闭文件对象
END;
过程中函数说明:
CHR(10) 是把数字10转化成对应的ASCII码回车
INSTR(xmlstr,CHR(10) 是在xmlstr中查找第一个回车出现的位置,返回整数。
SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10))-1)是截取字符串,截取xmlstr从第1个截取到第INSTR(xmlstr,CHR(10))-1个,也就是截取第一行XML 信息(因为原始的XML是分行的)。
如果不需要输出行号到控制台,仅仅写文件,如下过程更简洁:
DECLARE
result CLOB;
output_file UTL_FILE.FILE_TYPE;
xmlstr VARCHAR2(32767);
BEGIN
result := DBMS_XMLQuery.getXml('SELECT * FROM dept');
xmlstr := DBMS_LOB.SUBSTR(result,32767);
output_file := UTL_FILE.FOPEN('TEST_DIR','dept.xml','w');--打开
UTL_FILE.PUT(output_file,xmlstr);
UTL_FILE.FCLOSE(output_file);--关闭
END;
以下是读文件的例子:
DECLARE
input_file UTL_FILE.FILE_TYPE;
input_buffer VARCHAR2(4000);
BEGIN
input_file := UTL_FILE.FOPEN('TEST_DIR', 'dept.xml', 'r'); --打开
LOOP
UTL_FILE.GET_LINE(input_file,input_buffer);--读取
DBMS_OUTPUT.PUT_LINE(input_buffer);
END LOOP ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(input_file); --关闭
DBMS_OUTPUT.PUT_LINE('------------------');
END;
可以看出读取文件同样是三个步骤。