Использование UTL_FILE для передачи данных с сервера Oracle в локальную файловую систему с использованием JDBC? - PullRequest
1 голос
/ 30 июня 2010

Мне нужно использовать файл, который генерируется на сервере Oracle, и мне сказали, чтобы получить его с помощью пакета UTL_FILE.Я намереваюсь использовать файл в отличном сценарии и подключиться к базе данных.Это простой текстовый файл, и я хотел бы вытащить его на сервер и использовать его, как и любой другой текстовый файл, но я полагаю, что я готов прочитать данные из некоторого курсора, если это то, что должно произойти.1001 *

Я незнаком с PL / SQL и UTL_FILE.Кто-нибудь знает хороший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 01 июля 2010

Зависит от размера файла. Если оно относительно небольшое, то хранимая процедура может прочитать все это в одно большое поле (VARCHAR2, CLOB или BLOB) и вернуть это значение.

Может также стоить посмотреть внешние таблицы , где вы можете выбрать файл, как если бы это была простая таблица базы данных.

2 голосов
/ 01 июля 2010

Во-первых, я бы порекомендовал попробовать подход с использованием внешних таблиц, который рекомендует Гэри - есть большая вероятность, что это будет соответствовать вашим требованиям и позволит вам обрабатывать данные в файле как строки из таблицы в вашем коде вызова.

Моим следующим предложением будет написание функции, которая инкапсулирует доступ UTL_FILE и возвращает строки, используя PIPE ROW (таким образом вам не нужно считывать весь файл в память, прежде чем код начнет возвращать строки клиенту),

Эта функция может либо возвращать REF CURSOR (который JDBC, безусловно, может обработать) - в основном, дескриптор набора результатов - либо вы можете вернуть коллекцию типов объектов.

 CREATE OR REPLACE myType
 AS OBJECT 
    (user defined structure or something as simple as textline VARCHAR2(2000));

 CREATE OR REPLACE myTypeArray
 AS TABLE OF myType;

 CREATE OR REPLACE 
 FUNCTION myFunction(pFile IN VARCHAR2)
 RETURN myTypeArray PIPELINED
 AS
     lvRow myType;
 BEGIN
     UTL File code to open file and iterate over contents populating lvRow
         PIPE ROW(lvRow);
     end loop
     close file, etc
 END myFunction;

Затем получите доступ к этому, приведя результаты функции в select

 SELECT * FROM TABLE(myFunction(:filename))

Если у вас нет каких-либо параметров для функции или вы можете получить их из таблицы, вы можете даже обернуть это в представление.

Подход REF CURSOR в значительной степени оборачивает этот SQL-код в функцию

FUNCTION myFunction(pFilename)
RETURN sys_refcursor
IS
   lCursor sys_refcursor;
BEGIN

    OPEN lCursor FOR
    SELECT  textline 
    FROM    TABLE(CAST(myFileExtractFunction(pFilename) AS myTypeArray);
    RETURN lCursor;

END myFunction;

Но так как все это по сути заново изобретает внешние таблицы, дважды проверьте, что они не соответствуютваше требование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...