【问题标题】:Oracle read File from Directory with exceptionOracle 从目录中读取文件异常
【发布时间】:2012-11-29 17:37:21
【问题描述】:

我正在使用以下功能从目录中读取文件:

CREATE OR REPLACE FUNCTION loadBlobFromFile(p_file_name VARCHAR2) RETURN BLOB AS
  dest_loc  BLOB := empty_blob();
  src_loc   BFILE := BFILENAME('TMT', p_file_name);
BEGIN
  -- Open source binary file from OS
  DBMS_LOB.OPEN(src_loc, DBMS_LOB.LOB_READONLY);

  -- Create temporary LOB object
  DBMS_LOB.CREATETEMPORARY(
        lob_loc => dest_loc
      , cache   => true
      , dur     => dbms_lob.session
  );

  -- Open temporary lob
  DBMS_LOB.OPEN(dest_loc, DBMS_LOB.LOB_READWRITE);


    -- Load binary file into temporary LOB
    DBMS_LOB.LOADFROMFILE(
        dest_lob => dest_loc
      , src_lob  => src_loc
      , amount   => DBMS_LOB.getLength(src_loc));

  exception 
    when DBMS_LOB.operation_failed
    then
     return empty_blob();


 -- Close lob objects
  DBMS_LOB.CLOSE(dest_loc);
  DBMS_LOB.CLOSE(src_loc);

   -- Return temporary LOB object
  RETURN dest_loc;

END loadBlobFromFile;
/

我用

调用函数
select loadBlobFromFile('TESTl.doc') from dual;

当目录中存在文件时,我得到文件。当文件不存在时,我得到空的 Blob。

现在还有最后一个问题。当文件的大小为 0 字节时,我得到一个错误。

有人可以帮助我改进函数并在 dbms_lob.open 失败时返回一个 empty_blob() 吗?

非常感谢您!

【问题讨论】:

  • 使用用户定义的异常返回empty_clob()

标签: sql oracle function exception


【解决方案1】:

添加这样的异常。

  -- Open temporary lob
  DBMS_LOB.OPEN(dest_loc, DBMS_LOB.LOB_READWRITE);

  begin
    -- Load binary file into temporary LOB
    DBMS_LOB.LOADFROMFILE(
        dest_lob => dest_loc
      , src_lob  => src_loc
      , amount   => DBMS_LOB.getLength(src_loc));

  exception 
    when dbms_lob.operation_failed
    then
      return empty_blob();
  end;
..rest of your code.

【讨论】:

  • 谢谢你!现在,不存在的文件,不要再出问题了
【解决方案2】:

我找到了解决方案。 这是我在帮助下的最终代码 http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/DLP1/Default.aspx

函数代码:

    CREATE OR REPLACE FUNCTION loadBlobFromFile(p_file_name VARCHAR2) RETURN BLOB AS
  dest_loc  BLOB := empty_blob();
  src_loc   BFILE := BFILENAME('Directoryname', p_file_name);
BEGIN
  BEGIN

    -- Open source binary file from OS
    DBMS_LOB.OPEN(src_loc, DBMS_LOB.LOB_READONLY);

    -- Create temporary LOB object
    DBMS_LOB.CREATETEMPORARY(
          lob_loc => dest_loc
        , cache   => true
        , dur     => dbms_lob.session
    );

    -- Open temporary lob
    DBMS_LOB.OPEN(dest_loc, DBMS_LOB.LOB_READWRITE);


    -- Load binary file into temporary LOB
    DBMS_LOB.LOADFROMFILE(
        dest_lob => dest_loc
      , src_lob  => src_loc
      , amount   => DBMS_LOB.getLength(src_loc));


   exception 
    when DBMS_LOB.operation_failed --Wenn die Datei nicht vorhanden ist
    then
      DBMS_LOB.CLOSE(src_loc);
       return empty_blob();
    when DBMS_LOB.INVALID_ARGVAL  --Wenn die Datei 0 KB gross ist.
    then
      DBMS_LOB.CLOSE(dest_loc);
  DBMS_LOB.CLOSE(src_loc);
       return empty_blob();
  END;

 -- Close lob objects
  DBMS_LOB.CLOSE(dest_loc);
  DBMS_LOB.CLOSE(src_loc);

     -- Return temporary LOB object
  RETURN dest_loc;

END loadBlobFromFile;
/

调用函数:

select loadBlobFromFile('test.doc') from dual;

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 2010-10-11
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多