关于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;

可以看出读取文件同样是三个步骤。

原文地址:https://www.cnblogs.com/turnip/p/13854887.html