나는 소스 코드를 잘못 배치 한 Oracle
데이터베이스에 pl/java
클래스를 가지고 있습니다.Oracle 데이터베이스에서 pl/java 클래스 파일을 추출 할 수 있습니까?
디 컴파일러에 대해 실행할 수 있도록 데이터베이스에서 자바 바이트 코드를 가져 오는 방법이 있습니까?
나는 이미 ALL_SOURCE
과 Oracle
의 소유권 주장을 확인했습니다.
나는 소스 코드를 잘못 배치 한 Oracle
데이터베이스에 pl/java
클래스를 가지고 있습니다.Oracle 데이터베이스에서 pl/java 클래스 파일을 추출 할 수 있습니까?
디 컴파일러에 대해 실행할 수 있도록 데이터베이스에서 자바 바이트 코드를 가져 오는 방법이 있습니까?
나는 이미 ALL_SOURCE
과 Oracle
의 소유권 주장을 확인했습니다.
나는 이것을 최근에해야했고, 그것을하기위한 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, '')
}
}
클래스 파일 자체와 함께 리소스 추출 (예 : 속성 파일)을 포함하도록 위의 스크립트를 업데이트했습니다. –
일부 정보를 알고 있다면 dbms_java
을 사용할 수 있습니다.
자세한 내용은 질문에 의해 판단 할 때 export_class
; 이것은 당신의 부분에 더 많은 탐정 작업이 필요할 수 있습니다. 코드가 실제 패키지에 저장되어 있으면 dbms_metadata
도 도움이 될 것입니다.
자바 객체도 all_objects
에 나타나야합니다. 필요한 경우 스키마 및/또는 이름을 추적하는 데 도움이됩니다.
Google의 아주 오래된 시스템 중 일부를 파헤쳐 소스 코드를 찾을 수있었습니다. 그러나 나는 여전히 그 질문이 적절하다고 생각한다. – chotchki
왜 투표가 늦습니까? 이것은 내가 가진 진정한 생산 문제였습니다. – chotchki