代码之家  ›  专栏  ›  技术社区  ›  Ichorus

使用utl_文件使用jdbc将数据从Oracle服务器拉到本地文件系统?

  •  1
  • Ichorus  · 技术社区  · 14 年前

    我需要使用一个在Oracle服务器上生成的文件,并被告知使用utl_文件包获取该文件。我打算使用groovy脚本中的文件并与数据库建立连接。这是一个简单的文本文件,我想把它拉到服务器上,像使用任何其他文本文件一样使用它,但是我想如果需要的话,我愿意从某个光标读取数据。

    我不熟悉pl/sql和utl_文件。有人知道怎么做吗?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Gary Myers    14 年前

    取决于文件的大小。如果它相对较小,那么存储过程可以将其全部读取到一个大字段(varchar2、clob或blob)中,并将其作为值返回。

    也值得研究 external tables 您可以从文件中进行选择,就像它是一个普通的数据库表一样。

        2
  •  2
  •   JulesLt    14 年前

    首先,我建议尝试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;
    

    但是,由于所有这些基本上都是重新发明外部表,所以要仔细检查它们是否满足您的需求。