2012-06-06 83 views
2

什麼會導致以下行爲打開它:不能使用dbms_lob.filopen打開的文件,但可以使用UTL_FILE

數據庫11gR2的

declare 
    l_amt  number := dbms_lob.lobmaxsize; 
    l_dst_loc clob; 
    l_dst_offset number := 1; 
    l_lang_ctx number := dbms_lob.default_lang_ctx; 
    l_src_loc bfile; 
    l_src_offset number := 1; 
    l_warning number; 
begin 

    l_src_loc := bfilename('ODS_SERVER_DIRECTORY', '_CIVKD_ASU.CSV'); 
    dbms_lob.createtemporary(l_dst_loc, true); 
    dbms_lob.fileopen(l_src_loc, dbms_lob.file_readonly); 
    dbms_lob.loadclobfromfile(l_dst_loc 
          ,l_src_loc 
          ,l_amt 
          ,l_dst_offset 
          ,l_src_offset 
          ,dbms_lob.default_csid 
          ,l_lang_ctx 
          ,l_warning); 
    commit; 

    dbms_lob.fileclose(l_src_loc); 
    dbms_output.put_line(substr(l_dst_loc, 1, 200)); 

end; 
/

ORA-22288: file or LOB operation FILEOPEN failed 
. 
ORA-06512: in "SYS.DBMS_LOB", line 805 
ORA-06512: in line 31 
22288. 00000 - "file or LOB operation %s failed\n%s" 
*Cause: The operation attempted on the file or LOB failed. 
*Action: See the next error message in the error stack for more detailed 
      information. Also, verify that the file or LOB exists and that 
      the necessary privileges are set for the specified operation. If 
      the error still persists, report the error to the DBA. 

但是打開和使用UTL_FILE讀時完全相同的文件成功。

declare 
    l_file utl_file.file_type; 
    l_regel varchar2(4000); 
begin 

    l_file := utl_file.fopen('ODS_SERVER_DIRECTORY', '_CIVKD_ASU.CSV', 'R'); 
    -- Haal de volgende regel op 
    utl_file.get_line(l_file, l_regel); 

    dbms_output.put_line(l_regel); 
    utl_file.fclose_all; 
end; 

所以它看起來文件是可用的,並可由數據庫訪問。

這是我們第一次遇到這個特定的錯誤,它是第一個11gR2實例之一,所以也許有11g我們不知道?

===更新8-6-2012 === 取得了一些進展。事實證明,目錄對象指向共享驅動器。它是一個Windows服務器,Oracle作爲本地系統運行。我一直認爲在這種情況下無法從共享驅動器讀取任何內容。顯然在某些情況下,您可以使用utl_file但不使用dbms_lob。

回答

1

你能否證實ODS_SERVER_DIRECTORY是一個實際目錄

SELECT 
    * 
FROM 
    dba_objects 
WHERE 
    object_type = 'DIRECTORY' 
    AND object_name = 'ODS_SERVER_DIRECTORY' 

也許你擁有了它init.ora中的UTL_FILE_DIR參數設置(不應繼續做..)

但它的一個可能性至於爲什麼utl_file會看到目錄,dbms_lob不會。

+0

僅僅因爲你不應該使用UTL_FILE_DIR並不意味着你的DBA不會堅持它。 –

+0

謝謝,這絕對是一個目錄。一切都告訴我它應該工作,但它不是。最後的手段是重新啓動整個服務器,但這是不可能的。 – Rene

相關問題