Oracle loadjava 사용법

업데이트:

Oracle loadjava 사용법

Loadjava 설명 중요함!!

명령어 예시 => loadjava -u scott/tiger@ORCL -verbose -resolve OracleJDBCExample.java

loadjava 명령어를 사용하면 Oracle 은 OS JVM 이 아닌
Oracle DB 내부적으로 사용하는 JVM 을 사용합니다. 11g 는 기본 1.5 로 세팅 되어 있으며, 변경하는 방법은
저는 모릅니다. 검색해도 안나오더라구요. DBA 말로는 18c 에서는 JVM 이 설치되어 있지 않고 명령어로 설치를 해야 한다고하네요.

이것저것 해보니 안되는 상황이 좀 발생했습니다..
Hello World 수준은 당연히 잘 됩니다.

java, class, jar, zip 타입을 허용합니다.

java 파일내에서 사용하려는 함수는 무조건 Static 으로 정의 되어야 합니다.
이유는 Class명.함수명으로 호출해서 쓰기때문입니다. 

의존성 체크 없이 일단 loadjava 성공시키고 호출 시에 runtime 에러 체크를 하고자 하는경우에,
-resolve 옵션을 빼면 됩니다. 아마 jar 들을 넣을 때에는 그렇게 넣어야 할것 같아보이네요.

class 파일은 Oracle Javac 명령어로 컴파일 통과 한 녀석들만 load 가 되는것 같습니다.
OS javac 로 만들어진 녀석은 버전 이슈가 있을 경우, 안될 수 있습니다.

jar 파일을 zip 으로 묶어서 loadjava 하면 의존성 체크 안하고 전부다 JAVA RESOURCE 로
밀어 넣습니다. 근데 이녀석들을 참조하려고하면 안되는 것 같은 느낌이 드네요..

문제는 여러 Jar 파일의 소스를 참조하는 현실 코딩 상황에서 상당히 문제가 많습니다.
문제가 뭐냐하면
1. 참조 하는 JAR 를 loadjava 로 올려야 함
2. loadjava 로 jar 를 올리면 이녀석은 안의 class 파일을 일일이 다시 Oracle JVM 으로 compile 체크함
3. JVM 버전이 안맞으면 에러 발생
4. 관련 있는 jar 들을 한곳에 모아서 loadjava -u scott/tiger@ORCL -verbose *.jar 로 올리고 실행시에 에러 나는
   부분을 봐야 할 것 같습니다.

제가 정말 부득이 하게 개발을 Oracle 에서 해야 한다면, 저는 4번의 방법으로 시도하려 할 것입니다.
일단은 사용법만 적어 놓고 도전은 미뤘습니다. ㅋㅋ

JVM 생성 관련 스크립트 파일 실행 명령어

SQL>@$ORACLE_HOME/javavm/install/initjvm.sql
SQL>@$ORACLE_HOME/xdk/admin/initxml.sql
SQL>@$ORACLE_HOME/xdk/admini/xmljs.sql
SQL>@$ORACLE_HOME/rdbms/admin/catjava.sql

필요 권한 부여

call dbms_java.grant_permission('USERNAME', 'java.util.PropertyPermission','*', 'read,write');
execute dbms_java.grant_permission('USERNAME','java.util.PropertyPermission','*','read');
execute dbms_java.grant_permission( 'USERNAME', 'SYS:java.lang.RuntimePermission', 'getClassLoader', ' ' );
execute dbms_java.grant_permission( 'USERNAME', 'SYS:oracle.aurora.security.JServerPermission', 'Verifier', ' ' );
execute dbms_java.grant_permission( 'USERNAME', 'SYS:java.lang.RuntimePermission', 'accessClassInPackage.sun.util.calendar', ' ' ) ; 
execute dbms_java.grant_permission( 'USERNAME', 'java.net.SocketPermission', '*', 'connect,resolve' );
execute dbms_java.grant_permission( 'USERNAME', 'SYS:java.lang.RuntimePermission', 'createClassLoader', ' ');

loadjava 실행문 예시

loadjava -u scott/tiger@ORCL -verbose -resolve OracleJDBCExample.java
loadjava -u scott/tiger@ORCL -verbose -resolve OracleJDBCExample.class
loadjava -u scott/tiger@ORCL -verbose -resolve jarfile.zip
loadjava -u scott/tiger@ORCL -verbose -resolve test.jar

loadjava 로 올라간 객체 상태 확인

SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM USER_OBJECTS
WHERE OBJECT_TYPE LIKE '%JAVA%'
AND OBJECT_NAME = 'OracleJDBCExample';

함수 호출 관련 샘플

CREATE OR REPLACE FUNCTION OracleTest (str VARCHAR2)
RETURN VARCHAR AS
    language java name 'OracleJDBCExample.conDb(java.lang.String)
    return java.lang.String';   
/

SELECT OracleTest('Run Test') STR
FROM dual;

--필요에 따라 java 파일을 JDeveloper 와 같은 IDE 명령창에서 바로 만들 수도 있는데 
--아래 샘플 참고
-- 다시한번 얘기하지만, 함수명은 static 이어야 합니다.
CREATE OR REPLACE and RESOLVE JAVA SOURCE NAMED "HelloWorld" AS /*파일명*/

    import java.lang.*;
    import java.io.*;
    
    public class HelloWorld { /*클래스명*/
        public static String run(String str) {  /*함수*/
            byte test_type = 0; 
            
            try {
                long stTime = System.currentTimeMillis();
                long endTime = System.currentTimeMillis();
                return "HelloWorld";
            } catch(Exception e) {
                System.out.println(e.getMessage() + "bye");
                e.printStackTrace();
            }
        }
    };
/