可以这样建立目录对象。首先在磁盘建立目录文件夹,然后管理员登录建立目录对象:

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;

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

相关文章:

  • 2021-08-06
  • 2021-11-29
  • 2021-12-15
  • 2021-12-25
  • 2021-11-27
  • 2021-07-01
  • 2021-07-27
猜你喜欢
  • 2022-12-23
  • 2021-08-09
  • 2021-11-05
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案