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

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

  • 相关阅读:
    《张艺谋这个人》较真
    《智能》是真智能
    《解密小米之互联网下的商业奇迹》
    《三毛。。。。》烂漫
    《盛典―― 诺奖之行》
    常用iOS、Mac框架和库及常用中文开发博客
    《人脸识别与人体动作识别技术及应用》
    《程序员第二步从程序员到项目经理》
    《信息安全导论》
    [leetCode]141.环形链表
  • 原文地址:https://www.cnblogs.com/turnip/p/13854887.html
Copyright © 2020-2023  润新知