2012-02-21 4 views
1

나는 소스 코드를 잘못 배치 한 Oracle 데이터베이스에 pl/java 클래스를 가지고 있습니다.Oracle 데이터베이스에서 pl/java 클래스 파일을 추출 할 수 있습니까?

디 컴파일러에 대해 실행할 수 있도록 데이터베이스에서 자바 바이트 코드를 가져 오는 방법이 있습니까?

나는 이미 ALL_SOURCEOracle의 소유권 주장을 확인했습니다.

+0

Google의 아주 오래된 시스템 중 일부를 파헤쳐 소스 코드를 찾을 수있었습니다. 그러나 나는 여전히 그 질문이 적절하다고 생각한다. – chotchki

+0

왜 투표가 늦습니까? 이것은 내가 가진 진정한 생산 문제였습니다. – chotchki

답변

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, '') 
    } 
} 
+0

클래스 파일 자체와 함께 리소스 추출 (예 : 속성 파일)을 포함하도록 위의 스크립트를 업데이트했습니다. –

1

일부 정보를 알고 있다면 dbms_java을 사용할 수 있습니다.

자세한 내용은 질문에 의해 판단 할 때 export_class; 이것은 당신의 부분에 더 많은 탐정 작업이 필요할 수 있습니다. 코드가 실제 패키지에 저장되어 있으면 dbms_metadata도 도움이 될 것입니다.

자바 객체도 all_objects에 나타나야합니다. 필요한 경우 스키마 및/또는 이름을 추적하는 데 도움이됩니다.

관련 문제