오라클에서 자바 오브젝트 사용 - 함수 호출(IN/OUT, 테이블 SELECT)

2012. 2. 1. 10:53일 이야기


 1. 자바 소스 생성 & 컴파일


import java.util.*;
import java.io.*;
import java.sql.*;


public class Dname
{
    public static String getDname(int deptno) throws SQLException
    {
        String dname = null;
 
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        StringBuffer sql = null;
        sql = new StringBuffer()
            .append("SELECT  DNAME       " + "\n")
            .append("  FROM  DEPT        " + "\n")
            .append(" WHERE  DEPTNO = ?  " + "\n");


        try
        {
            conn = DriverManager.getConnection("jdbc:default:connection:");
            pstmt = conn.prepareStatement(sql.toString());

            int index = 1;
            pstmt.setInt(index++, deptno);

            rs = pstmt.executeQuery();

            if (rs.next())
            {
                dname = rs.getString("DNAME");
            }
        }
        /*
        catch (SQLException e)
        {
            e.printStackTrace();
            System.err.println(e.getMessage());
        }
        */
        finally
        {
            closeResultSet(rs);
            closeStatement(pstmt);
        }


        return  dname;
    }


    /**
     * close ResultSet.
     *
     * @param   rs
     */
    public static void closeResultSet(ResultSet rs) {


        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            // ignore
        }
    }


    /**
     * close Statement.
     *
     * @param   stmt
     */
    public static void closeStatement(Statement stmt) {


        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            // ignore
        }
    }
};


2. 자바 소스 로드

loadjava -u scott/tiger@localhost:1521:ORCL -v -r -t Dname.java

// jar를 로드할 때
loadjava -u scott/tiger@localhost:1521:ORCL -v -t poi-3.2-FINAL-20081019.jar
// 소스를 로드할 때
loadjava -u scott/tiger@localhost:1521:ORCL -v -r -t TableDescExcelDown.java 

[참고] jar 파일을 통째로 리소스 형태로 올릴려고 몇번 시도를 해 보았으나,
TableDescExcelDown 에서 참조하지 못하고 계속 에러가 났습니다.
그냥 클래스 형태로 jar 파일을 올릴 수 밖에 없는 것 같습니다.

3. 자바 클래스를 호출하는 펑션 생성

CREATE OR REPLACE FUNCTION FN_DNAME (
    IN_DEPTNO    NUMBER
)
RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'Dname.getDname(int) return java.lang.String';

CREATE OR REPLACE PROCEDURE SP_TABLE_DESC_EXCEL_DOWN (
    FILE_NAME     VARCHAR2,
    OWNER         VARCHAR2,
    TABLE_NAME    VARCHAR2
)
AS LANGUAGE JAVA
NAME 'TableDescExcelDown.craeteTableDesc(java.lang.String, java.lang.String, java.lang.String)';

4. 펑션 호출

// 쓰기권한이 필요한 경우
//SYSTEM 으로 로그인 후 SCOTT 유저의 파일 쓰기 권한 설정 : 특정 디렉토리에 쓰기 권한을 추가
call DBMS_JAVA.GRANT_PERMISSION('SCOTT', 'SYS:java.io.FilePermission', 'D:\ssari\encyclopedia\oracle\java object\test7\*', 'write' );


SELECT  FN_DNAME(10) FROM  DUAL;

 

5. 소스를 드랍할 때

dropjava -u scott/tiger@localhost:1521:ORCL -v -t Dname.java 

// jar를 드랍할 때
dropjava -u scott/tiger@localhost:1521:ORCL -v -t poi-3.2-FINAL-20081019.jar
// 소스를 드랍할 때
dropjava -u scott/tiger@localhost:1521:ORCL -v -t TableDescExcelDown.java

출처 :  http://blog.naver.com/ssari93/130083061792  
          http://99yurina.blog.me/20128140494