Можете ли вы извлечь файл класса pl / java из базы данных Oracle? - PullRequest
1 голос
/ 22 февраля 2012

У меня есть класс pl/java в работающей базе данных Oracle, в которую я поместил исходный код.

Есть ли способ получить байт-код java из базы данных, чтобы я мог запустить его на декомпиляторе?

Я уже проверил ALL_SOURCE и Oracle утверждает, что у него нет исходного кода.

Ответы [ 2 ]

4 голосов
/ 25 октября 2012

Мне пришлось сделать это самому недавно и собрать для этого скрипт Groovy.Вам нужно изменить детали подключения и убедиться, что у вас есть драйверы базы данных Oracle на вашем classpath

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 голос
/ 22 февраля 2012

Если вам известна некоторая информация об этом, вы можете использовать dbms_java.

Конкретно, судя по вашему вопросу, export_class; хотя это может потребовать больше детективной работы с вашей стороны. Если ваш код хранится в реальном пакете, dbms_metadata также может помочь.

Java-объекты также должны отображаться в all_objects, что поможет вам при необходимости отслеживать схему и / или имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...