我需要使用在Oracle服务器上生成的文件,并且我被告知要使用UTL_FILE包来获取它。我打算在groovy脚本中使用该文件并与数据库建立连接。这是一个简单的文本文件,我想将它下载到服务器并像其他任何文本文件一样使用它,但我想我愿意从某些游标中读取数据,如果这是需要发生的事情。 / p>
我不熟悉PL / SQL和UTL_FILE。有谁知道这样做的好方法?
答案 0 :(得分:4)
取决于文件的大小。如果它相对较小,那么存储过程可以将它全部读入一个大字段(VARCHAR2,CLOB或BLOB)并将其作为值返回。
还可以值得查看external tables,您可以从文件中进行选择,就好像它是一个普通的数据库表一样。
答案 1 :(得分:2)
首先,我建议尝试一下Gary推荐的外部表格方法 - 这很有可能满足您的要求,并且允许您将文件中的数据视为来自调用代码中表格的行。< / p>
我的下一个建议是编写一个封装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 * 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;
但由于所有这些都是重新发明外部表格,请仔细检查它们是否符合您的要求。