首先,我建议尝试Gary推荐的外部表方法-这很有可能满足您的要求,并允许您将文件中的数据视为调用代码中表中的行。
我的下一个建议是编写一个函数来封装utl_文件访问,并使用管道行返回行(这样,在代码开始将行返回到客户机之前,您不需要将整个文件读取到内存中)。
这个函数可以返回一个引用光标(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;
但是,由于所有这些基本上都是重新发明外部表,所以要仔细检查它们是否满足您的需求。