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

时间:2012-02-21 22:30:34

标签: java oracle stored-procedures

我在正在运行的 pl/java 数据库中有一个 Oracle 类,我把源代码放错了地方。

有没有让java字节码退出数据库,所以我可以针对反编译器运行它?

我已经检查过ALL_SOURCE Oracle 声称它没有源代码。

2 个答案:

答案 0 :(得分:4)

我最近必须自己做这个,然后整理一个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, '')
    }
}

答案 1 :(得分:1)

如果您了解有关它的一些信息,那么您可以使用dbms_java

具体来说,根据您的问题判断export_class;虽然这可能需要你做更多的侦探工作。如果您的代码存储在实际的包中,dbms_metadata也应该能够提供帮助。

Java对象也应显示在all_objects中,如果需要,它可以帮助您跟踪架构和/或名称。