能否从Oracle数据库中提取pl/java类文件?

能否从Oracle数据库中提取pl/java类文件?,java,oracle,stored-procedures,Java,Oracle,Stored Procedures,我在一个运行的Oracle数据库中有一个

我在一个运行的
Oracle
数据库中有一个类,我把源代码放错了位置

有没有办法把java字节码从数据库中取出来,这样我就可以在反编译器上运行它


我已经检查了所有源代码,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, '')
    }
}

我通过挖掘一些非常古老的系统,设法找到了源代码。不过,我仍然认为这个问题是相关的。为什么投反对票?这是我遇到的一个真正的生产问题。我已经更新了上面的脚本,除了类文件本身之外,还包括了资源(例如属性文件)的提取。