使用UTL_FILE使用JDBC将数据从Oracle服务器提取到本地文件系统?

时间:2010-06-30 15:54:52

标签: oracle jdbc groovy plsql

我需要使用在Oracle服务器上生成的文件,并且我被告知要使用UTL_FILE包来获取它。我打算在groovy脚本中使用该文件并与数据库建立连接。这是一个简单的文本文件,我想将它下载到服务器并像其他任何文本文件一样使用它,但我想我愿意从某些游标中读取数据,如果这是需要发生的事情。 / p>

我不熟悉PL / SQL和UTL_FILE。有谁知道这样做的好方法?

2 个答案:

答案 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;

但由于所有这些都是重新发明外部表格,请仔细检查它们是否符合您的要求。