2016-07-26 8 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; 

任意の新しいディレクトリが作成されている場合しかし、私は将来的に問題がforseeすることができます。名前をハードコードする代わりにin_file_nameがディレクトリであるかどうかを確認する方法はありますか?

考えられる1つの可能性は、UTIL_OS.run_cmd('echo */')を実行してディレクトリのリストを取得することです。しかし、私はどのように出力を取得し、そのIFステートメントでそれを使用するか分からない。

ありがとうございます!

+0

を使用すると、Oracleディレクトリ・オブジェクトとして存在しているOSディレクトリの下にチェックしているファイル/ディレクトリはありますか? –

+0

@AlexPooleはい。 – user3224907

答えて

2

ディレクトリオブジェクトを使用していて、渡されたファイル名がその下のファイル(またはディレクトリ)であると仮定すると、utl_file.fgetattr() procedureを使用してテストできます。渡された名前がファイルの場合、fexistsフラグがtrueになり、存在しないか、またはプレーン・ファイルではなくディレクトリである場合はfalseになります。 (これは文書化されていないようですが、少なくとも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 - ごめんなさい。 '!'を 'not'に変更しました.... –

関連する問題