我们目前有一个内部构建的修补机制,可以在Windows应用程序服务器上运行。修补程序的暂存文件位于通过UNC路径访问的共享SAN上。我们目前在具有嵌入式PL / SQL的应用程序服务器上运行实用程序,或直接执行存储过程来管理我们的Oracle 11g数据库对象。
我有一个新要求,即加载上面提到的UNC路径下的XML文件,并将其加载到Oracle的表中。鉴于输入文件可以驻留的位置存在以下限制;
看来我们有以下选项;
还有其他选择吗?我错过了一些明显的东西吗?
库尔特
答案 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