sql >> データベース >  >> RDS >> Oracle

外部テーブルの場所とファイル名を取得しますか?

    アクセスパラメータ内のファイル名をキャプチャする方法を知りません。回避策として、元のファイルを変更するのではなく、プリプロセッサを使用してその場でファイル名を追加することができます。ファイルが2つある場合は、file_1.csvと言います。 a,b,1を含む およびfile_2.csv c,d,2を含む 、append_filename.shのような小さなシェルスクリプトを作成できます。 :

    #!/bin/bash
    while read line
    do
      printf "%s,%s\n" "${line}" "${1##*/}"
    done < $1
    

    スクリプトを直接呼び出すことで、何か役立つことを確認できます:

    $ ./append_filename.sh file_1.csv
    a,b,1,file_1.csv
    

    次に、外部テーブルを定義して、preprocessorを介して呼び出すことができます。 句、次のようなもの:

    create table e42 (
      col1 varchar2(10),
      col2 varchar2(10),
      col3 number,
      filename varchar2(30)
    )
    organization external (
      type oracle_loader
      default directory d42
      access parameters (
        records delimited by newline
        preprocessor 'append_filename.sh'
        fields terminated by ','
      )
      location ('file_1.csv', 'file_2.csv')
    );
    
    Table E42 created.
    

    次に、ファイル名が自動的に取得されます:

    select * from e42;
    
    COL1       COL2             COL3 FILENAME                     
    ---------- ---------- ---------- ------------------------------
    a          b                   1 file_1.csv                    
    c          d                   2 file_2.csv                    
    

    ディレクトリパスを削除したので、ファイル名のみが表示されます。必要に応じてフルパスを保持できますが、それは必要ない場合があり、テーブルのクエリのみを実行できるユーザーにOSの詳細を公開できます。セキュリティガイドラインに注意してください。ここでは、すべてに1つのディレクトリを使用することでシンプルにしていますが、プリプロセッサは別の場所に配置する必要があります。そしてもちろん、これはUnix-yプラットフォームまたはGNUツールを想定しています。 Windowsを使用している場合は、バッチファイルでも同様のことが可能です。

    行ごとに読み取るこのアプローチは、大きなファイルの場合は比較的遅くなります。 150万行のテストファイルでファイル名を追加すると、私のプラットフォームでは約80秒かかりました。他の組み込みツールはより高速になります。 sedを使用したこのバージョン 同じファイルで1秒強かかります:

    #!/bin/bash
    sed -e 's!$!,'"${1##*/}"'!' $1
    

    awkなどの他の方法を試すこともできます それも;おそらく、ご使用の環境で何が最適に(または十分に高速に)機能するかを確認するために、いくつかのテストを行う必要があります。



    1. SQLiteで現在の日付を取得する方法

    2. ひねりを加えた時制データベースの設計(ライブ行とドラフト行)

    3. Windows認証またはSQLServer認証を使用してSQLServerインスタンスに接続する方法-SQLServer/T-SQLチュートリアルパート3

    4. OracleのrownumのようにMysqlの行番号を取得する方法はありますか?