Во-первых, я бы порекомендовал попробовать подход с использованием внешних таблиц, который рекомендует Гэри - есть большая вероятность, что это будет соответствовать вашим требованиям и позволит вам обрабатывать данные в файле как строки из таблицы в вашем коде вызова.
Моим следующим предложением будет написание функции, которая инкапсулирует доступ 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;
Но так как все это по сути заново изобретает внешние таблицы, дважды проверьте, что они не соответствуютваше требование.