能否从Oracle数据库中提取pl/java类文件?
我在一个运行的能否从Oracle数据库中提取pl/java类文件?,java,oracle,stored-procedures,Java,Oracle,Stored Procedures,我在一个运行的Oracle数据库中有一个
Oracle
数据库中有一个我已经检查了所有源代码,Oracle声称它没有源代码。如果你知道一些关于它的信息,那么你可以使用 具体来说,根据您的问题判断,
export_class
;虽然这可能需要你做更多的侦查工作。如果您的代码存储在实际的包中,dbms\u metadata
也应该能够提供帮助
Java对象也应该出现在所有对象中,这将帮助您根据需要跟踪模式和/或名称。我最近不得不自己做这件事,并编写了一个Groovy脚本。您需要修改连接详细信息,并确保类路径上有Oracle数据库驱动程序
import groovy.sql.Sql
// Change the following to your requirements ...
def extractRoot = "extracted-classes/" // Directory to extract classes into
def user = 'SCOTT' // Schema user
def password = 'tiger' // Yes, it's the password
def host = 'localhost' // Database host
def sid = 'orcl' // Database SID
def port = 1521 // Database listener port
def saveBlob(blob, root, name, extension) {
def byteStream = blob.getBinaryStream()
def bytes = new byte[blob.length()]
byteStream.read(bytes)
def dir = root + name.replaceAll(/\/[^\/]+$/, '')
if (dir != name) {
new File(dir).mkdirs()
}
def f = new File(root + name + extension)
println "Writing ${f.getCanonicalPath()}"
f.delete()
f.withOutputStream { s ->
s.write(bytes)
}
}
sql = Sql.newInstance("jdbc:oracle:thin:@${host}:${port}:${sid}", user,
password, 'oracle.jdbc.driver.OracleDriver')
sql.eachRow("select name from all_java_classes where owner = ${user}") {
sql.call('''
declare
b blob;
begin
dbms_lob.createtemporary(b, FALSE);
dbms_java.export_class(?, ?, b);
? := b;
end;''', [it.name, user, Sql.BLOB]) { blob ->
saveBlob(blob, extractRoot, it.name, '.class')
}
}
sql.eachRow("select dbms_java.longname(object_name) \"name\" from all_objects where object_type = \'JAVA RESOURCE\' and owner = ${user}") {
sql.call('''
declare
b blob;
begin
dbms_lob.createtemporary(b, FALSE);
dbms_java.export_resource(?, ?, b);
? := b;
end;''', [it.name, user, Sql.BLOB]) { blob ->
saveBlob(blob, extractRoot, it.name, '')
}
}
我通过挖掘一些非常古老的系统,设法找到了源代码。不过,我仍然认为这个问题是相关的。为什么投反对票?这是我遇到的一个真正的生产问题。我已经更新了上面的脚本,除了类文件本身之外,还包括了资源(例如属性文件)的提取。