проблема в поиске списка файлов в каталоге - PullRequest
4 голосов
/ 15 ноября 2010

Я хочу получить список всех файлов в определенной папке, которая включает в себя форму оракула и меню, отчет и некоторый текстовый файл ...

У вас есть идея, как я могу получить эти данные в форме ORACLE и автоматически вставить их в свой блок данных?

Я использую форму оракула 6.0.

Ответы [ 2 ]

5 голосов
/ 15 ноября 2010

Я сделал что-то вроде этого:

Создайте каталог 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 };
      }
  }

  }

И вызываемая процедура PL / SQL для вызова Java:

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

Наконец, вызов процедуры get_dir_list внутри вашей формыЗаполните таблицу файлами в вашем каталоге, которые затем можно прочитать в блоке формы.

Java-код появился прямо из книги Тома Кайта (не помню, какой именно).

РЕДАКТИРОВАТЬ:

На самом деле весь код в значительной степени извлечен из этого AskTom потока .

3 голосов
/ 21 ноября 2016

Существует еще один интересный подход с внешними таблицами, который позволяет еще проще получать такие списки без использования хранимой процедуры 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

В sqlplus:

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.

...