4

Oracleフォームとメニューとレポートおよびいくつかのtxtファイルを含む特定のフォルダ内のすべてのファイルのリストを取得したい...

これらのデータをORACLE形式で取得し、データブロックに自動的に挿入する方法を知っていますか?

私はOracleフォーム6.0を使用しています。

4

2 に答える 2

7

私はこれらの線に沿って何かをしました:

リストするディレクトリのOracleディレクトリを作成します。

create or replace directory YOURDIR
  as '\path\to\your\directory';

一時テーブルを作成します。

create global temporary table DIR_LIST
(
  FILENAME VARCHAR2(255),
)
on commit preserve rows;
grant select, insert, update, delete on DIR_LIST to PUBLIC;

Javaストアドプロシージャが必要です。

create or replace and compile java source named dirlist as
import java.io.*;
  import java.sql.*;
  import java.text.*;

  public class DirList
  {
  public static void getList(String directory)
                     throws SQLException
  {
      File dir = new File( directory );
      File[] files = dir.listFiles();
      File theFile;

      for(int i = 0; i < files.length; i++)
      {
          theFile = files[i];
          #sql { INSERT INTO DIR_LIST (FILENAME)
                 VALUES (:theName };
      }
  }

  }

そして、Javaを呼び出すためのPL /SQL呼び出し可能プロシージャ:

CREATE OR REPLACE PROCEDURE get_dir_list(pi_directory IN VARCHAR2)
AS LANGUAGE JAVA
name 'DirList.getList(java.lang.String)';

最後に、フォーム内でプロシージャget_dir_listを呼び出すと、ディレクトリ内のファイルがテーブルに入力され、フォームブロックに読み込むことができます。

Javaコードは、Tom Kyteの本から直接出てきました(どれを思い出せないでください)。

編集:

実際、すべてのコードはこのAskTomスレッドからほとんど削除されています。

于 2010-11-15T16:16:15.963 に答える
7

Javaストアード・プロシージャーを使用せずにそのようなリストをさらに簡単に取得できるようにする、外部テーブルを使用した別の興味深いアプローチがあります。

$ mkdir /tmp/incoming

$ cat >/tmp/incoming/readdir.sh<<eof
#/bin/bash
cd /tmp/incoming/
/bin/ls -1
eof

# test files
$ for i in {1..5}; do touch /tmp/incoming/invoice_no_$RANDOM.pdf; done

SQL * Plusの場合:

create or replace directory incoming as '/tmp/incoming';

Directory INCOMMING created.

create table files (filename varchar2(255))
organization external ( 
    type oracle_loader
    default directory incoming
    access parameters (
        records delimited by newline
        preprocessor  incoming:'readdir.sh'
        fields terminated by "|" ldrtrim
    )
location ('readdir.sh')
);
/

Table FILES created.

select * from files;

FILENAME                                                                       
--------------------------------------------------------------------------------
FILES_27463.log                                                                 
invoice_no_20891.pdf                                                            
invoice_no_2255.pdf                                                             
invoice_no_24086.pdf                                                            
invoice_no_30372.pdf                                                            
invoice_no_8340.pdf                                                             
readdir.sh                                                                      

 7 rows selected 

このアプローチは、@DCookieの回答で言及されているのと同じAskTomスレッドに追加されました。

于 2016-11-21T20:18:17.383 に答える