从存储过程加载XML文档,其中文档位于Windows服务器

时间:2018-04-09 16:57:13

标签: xml oracle11g sql-loader

我们目前有一个内部构建的修补机制,可以在Windows应用程序服务器上运行。修补程序的暂存文件位于通过UNC路径访问的共享SAN上。我们目前在具有嵌入式PL / SQL的应用程序服务器上运行实用程序,或直接执行存储过程来管理我们的Oracle 11g数据库对象。

我有一个新要求,即加载上面提到的UNC路径下的XML文件,并将其加载到Oracle的表中。鉴于输入文件可以驻留的位置存在以下限制;

Options

看来我们有以下选项;

  1. 将实用程序和shell写入操作系统以执行SQL Plus或SQL Loader以加载XML。请注意,我们的修补机制无法调用脚本文件。
  2. 将外部Samba共享安装到UNC路径并使用外部表(不确定这将有效),并从SP调用
  3. 编写一个实用程序,将XML复制到Oracle服务器,并使用外部表或UTL_FILE加载。
  4. 还有其他选择吗?我错过了一些明显的东西吗?

    库尔特

1 个答案:

答案 0 :(得分:0)

还有另一个选项是SQLcl:http://www.oracle.com/technetwork/developer-tools/sqlcl/overview/index.html

这是sqldev中的脚本引擎,它被分解为一个命令行。由于它是基于java的,它也可以做一些客户端编码。有关github here上脚本的更多详细信息。这是一个将目录中的所有文件加载到表中的示例。

drop table k
/
CREATE TABLE K
(   PATH VARCHAR2(2000),
    BLOB_CONTENT BLOB,
    WHEN TIMESTAMP (6)
)
/
script

/* create a temp blob to be used in the insert */
getBlobFromFile=function (fileName){
   try {
     var b = conn.createBlob();
     var out = b.setBinaryStream(1);
     var path = java.nio.file.FileSystems.getDefault().getPath(fileName);
     java.nio.file.Files.copy(path, out);
     out.flush();
     return b;
  } catch(e){
    ctx.write(e);
  }
};


var File = Java.type("java.io.File")
var FilenameFilter = Java.type("java.io.FilenameFilter")
/* Files */
var dir = "."
var cwd = new File(dir);
var allFiles = cwd.listFiles();


for(var file in allFiles){
     /* only load files not dirs */
     if (allFiles[file].isFile() ){
          /* define binds */
          var binds = {}
          /* add path/filename as a bind */
          binds.path=allFiles[file].toString().substring(2);

          ctx.write("Loading:"+  allFiles[file]  + "\n")

          blob = getBlobFromFile(allFiles[file]);

              ctx.write("\t>"+ blob.length()+":" + allFiles[file]  + "\n")
              binds.b = blob;
              /* exec the insert and pass binds */
              var ret = util.execute("insert into k(path,blob_content,when) values(:path , :b,systimestamp)",binds);
              var ex = util.getLastException();
              if ( ex ){
                ctx.write(ex+ "\n")

               }
      }
}
/
select path,dbms_lob.getlength(blob_content) from k order by when desc
/

然后在此表中

**PATH**                       **DBMS_LOB.GETLENGTH(BLOB_CONTENT)** 
sync.js                                                3924 
rspool.sql                                              105 
chew_roar.wav                                        256810 
customjson.sql                                           92