2016-07-26 63 views
0

我正在處理一個包作爲in_file_name參數傳遞目錄中文件名的包,但調用程序也傳遞了子目錄名,它不應該這樣做。現在,我放棄了包裝,如果in_file_name是一個子目錄執行以下操作:Oracle PL/SQL - 檢查輸入參數是否爲目錄

IF in_file_name IN ('sub_dir_1','sub_dir_2','sub_dir_3') 
    THEN 
     RETURN; 
    END IF; 

不過,我如果在創建任何新目錄在未來預見的問題。有沒有辦法檢查in_file_name是否是一個目錄而不是硬編碼名稱?

我能想到的一種可能性是運行UTIL_OS.run_cmd('echo */')來獲取目錄列表。但我不知道如何獲得輸出並在IF聲明中使用它。

謝謝!

+0

是你存在作爲Oracle目錄對象的操作系統目錄下檢查文件/目錄? –

+0

@AlexPoole是的。 – user3224907

回答

2

假設您正在使用目錄對象,並且傳遞的文件名是該目錄下的文件(或目錄),則可以使用utl_file.fgetattr() procedure進行測試;如果傳遞的名稱是一個文件,fexists標誌將爲true,如果它不存在或者是一個目錄而不是一個普通文件,那麼它將是錯誤的。 (這似乎沒有記錄;但它至少在Linux上是如何工作的)。

所以你需要聲明一些其他變量,但那麼可以這樣做:

utl_file.fgetattr(
    location => your_directory, 
    filename => in_file_name, 
    fexists => l_fexists, 
    file_length => l_file_length, 
    block_size => l_block_size); 

if not l_fexists then 
    -- handle file not existing OR being a directory 
end if; 
+0

當我試圖編譯它時,'IF!l_fexists'導致'PLS-00103:遇到符號!''''' – user3224907

+0

@ user3224907 - 抱歉,語言混淆;將'!'改爲'不是'.... –