zoukankan      html  css  js  c++  java
  • Oracle 异常在UTL_FILE.GET_FILE中的应用

    Deliberate

    Oracle代码本身有意依赖于异常工作,这意味着必须预计到有异常发生,并为异常编码。

    示例: 从文件中,一行一行的读取文本,读到文尾时触发no_data_found异常,再关闭文件句柄。

    create or replace procedure read_file(dir_in in varchar2,file_in in varchar2)
    is
        l_file utl_file.file_type;
        l_line varchar2(32767);
    begin
        l_file := utl_file.fopen(dir_in,file_in,'r',32767);
    
    -- 在循环体中,get_line(),从文件中一行行的读取,当读到最后时,触发no_data_found 异常         
    loop
            utl_file.get_line(l_file,l_line,32767);
            dbms_output.put_line(l_line);
        end loop;
    exception
    -- 在异常中,关闭文件句柄
        when no_data_found
        then
            utl_file.fclose(l_file);
            dbms_output.put_line('Good');
    end read_file;
    

    小结:

      在loop循环体中没有使用exit退出循环,而是在get_line() 读到最后文尾时触发了NO_DATA_FOUND异常,并在异常中关闭了文件句柄。该异常是我们可预见的、期待的。

    ERROR参考如下:

    一、创建完过程时发生sysdba 未对当前用户授权 UTL_FILE的错误:

    切换到sysdba: connect sys/XXX as sysdba;           XXX表示Oracle DBA用户的密码

     给当前用户授权UTL_FILE:grant execute on utl_file to 当前用户;

    二、在执行过程时,execute read_file('D: emp','abc.txt'); 常见的错误有 'invalid directory path'。原因:11g以后建议使用directory变量替换utl_file第一个参数,这时写具体的路径会提示无效路径,因此,需要定义一个directory变量,代替D: emp,具体做法如下:

    创建directory变量:create or replace directory D_DIR as 'D: emp';        [我的电脑,正反斜杠都可以]

    如果上面的directory变量 是在当前用户下定义的则以,否则如果是在SYSDBA下定义的,也需要给使用的用户授权,如下:

    给当前用户授权directory变量 :grant read,write on directory D_DIR to 当前用户;   【D_DIR、当前用户, -------》 都必须大写】

    三、最后执行上面的过程:

    execute read_file('D_DIR','abc.txt');

    扩展:

    查看当前用户被授权的内容:select * from dba_tab_privs where grantee = '当前用户';

    授权:grant read,write on directory D_DIR to '当前用户';

    取消授权:revoke read,write on directory D_DIR from '当前用户';

  • 相关阅读:
    all the tops
    es6 and typescript
    [leetcode]question5: Longest Palindromic Substring
    webpack and publish lib
    HTTPClient to use http/https protocol to send request
    《算法导论》-分治法-笔记
    《Linux C编程一站式学习》-笔记
    WIN7中同时打开多个独立Excel窗口
    RAD Studio XE6之Tpanel
    vb中StatusBar1.Panels(3).Text = Format(Date, "yyyy年mm月dd日")是什么意思
  • 原文地址:https://www.cnblogs.com/pandora2050/p/12844117.html
Copyright © 2011-2022 走看看