Java Stored Procedure 만들기

 Java Stored Procedure 예제
 
  Java Stored Procedure는 웹 개발시 배치잡(Batch Job) 형태의 작업이나, 많은 데이터의 작업이 필요한 경우 뛰어난 성능 향상을 가져 올 수 있습니다. 또한 PL/SQL로 구현하기 어려우나 Java로 구현이 편리할 경우(예를 들어 OS 파일 핸들링, 암호화..) 사용하면 성능 향상과 동시에 편리하게 사용 할 수 있다.
 
  생성 방법 요약
  1) Writing the JAva Classes
– JAVA 소스생성
  2) Load and Resolve the Java Classes
– loadjava를 이용하여 class를 DB에 Load
  3) Publish the Java Classes
– load된 자바클래스를 이용하여 오라클 프로시저/함수 만들기
  4) Call the Stored Procedure or Function
– 프로시저 또는 함수를 사용
 
  아래 예저는 OS 파일을 읽고, 이름을 변경할 수 있는 Java Stored Procedure 예제입니다.  PL/SQL에서 OS상의 파일에 대한 작업을 하려면 UTL_FILE패키지 이용 할 수 있지만 많은 불편함이 있습니다. Java Stored Procedure를 사용해서 작업하는 예제입니다.
 
① JAVA 소스생성
package com.oracleclub.odd.jsp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileUtil {
    /**
     *파일을 읽어서 String으로 반환<br/>
     *@param fileDir  파일 경로와 파일명 String
     *@return 파일 데이터 byte[]
     */
    public static String readFile(String fileDir) {
        byte[] bytes = null;
        String data = "";
        try{
            FileInputStream fis = new FileInputStream(fileDir);
            bytes = new byte[fis.available()];
            fis.read(bytes);
            fis.close();
            data = new String(bytes);
        } catch(IOException ioe){
            System.out.println(" FileUtil.readFile error : "+ioe.getMessage());
        } finally {
        }
        return data;
    }
   
    /**
     *oldFileName을 newFileName 파일명으로 변경.<br/>
     *@param oldFileName String
     *@param newFileName String
     *@return boolean
     */
    public static void renameFile(String oldFileName, String newFileName) {
        try{
            if (File.separatorChar != ‘/’) {
                oldFileName = oldFileName.replace(File.separatorChar, ‘/’);
                newFileName = newFileName.replace(File.separatorChar, ‘/’);
            }
            File oldFile = new File(oldFileName);
            File newFile = new File(newFileName);
            if(!oldFile.exists())
                System.out.println("FileHndr.renameFile() Not Exist Source File : "+ oldFile);
            else
                oldFile.renameTo(newFile);
                System.out.println("파일명이 변경 되었습니다 –>"+newFile);
        } catch(Exception e){
            System.out.println(" FileUtil.renameFile error : "+e.getMessage());
        }
    }
}
② loadjava를 이용하여 class를 DB에 Load
 E:\class directory>loadjava -u scott/tiger -v FileUtil.class
  -v : verbose모드 옵션
  -u : oracle 사용자
  -resolve : .class파일이 아닌 .java파일을 지정할때 컴파일 함
— 정상적으로 생성되었는지 확인
C:\>SQLPLUS scott/tiger
SQL>SELECT object_name
        FROM USER_OBJECTS
        WHERE object_type=’JAVA CLASS’;
③ load된 자바클래스를 이용하여 오라클 프로시저/함수 만들기
— 파일을 읽어 출력하는 함수 (Java 메소드에서 Return 값이 있으면 함수로 생성)
— NAME 키워드 뒤에 패키지.클래스.메소드 명을 입력 합니다.
CREATE OR REPLACE FUNCTION read_file(fileName VARCHAR2)
    RETURN VARCHAR2
    AS
    LANGUAGE JAVA
    NAME ‘com.oracleclub.odd.jsp.FileUtil.readFile(java.lang.String) return java.lang.String’;
/
— 파일명을 변경하는 프로시저 (Java 메소드에서 Return 값이 없으면 프로시저로 생성)
CREATE OR REPLACE PROCEDURE rename_file(oldName VARCHAR2, newName VARCHAR2)
    AS
    LANGUAGE JAVA
    NAME ‘com.oracleclub.odd.jsp.FileUtil.renameFile(java.lang.String, java.lang.String)’;
/
— 패키지로 생성해서 사용 할 수도 있습니다.
CREATE OR REPLACE PACKAGE file_util IS
    FUNCTION  read_file(fileName VARCHAR2) RETURN VARCHAR2;
    PROCEDURE rename_file(oldName VARCHAR2, newName VARCHAR2);
END file_util;
/
CREATE OR REPLACE PACKAGE BODY file_util IS
    FUNCTION read_file(fileName VARCHAR2) RETURN VARCHAR2
    AS
    LANGUAGE JAVA
    NAME ‘com.oracleclub.odd.jsp.FileUtil.readFile(java.lang.String) return java.lang.String’;
    PROCEDURE rename_file(oldName VARCHAR2, newName VARCHAR2)
    AS
    LANGUAGE JAVA
    NAME ‘com.oracleclub.odd.jsp.FileUtil.renameFile(java.lang.String, java.lang.String)’;
END file_util;
/
④ 프로시저 또는 함수를 사용.
— 파일을 읽고 쓸 수 있는 권한을 부여하기 위해 SYS 유저로 접속
SQL>CONN / AS SYSDBA
— 권한을 부여하지 않으면 "ERROR! Handling File: the Permission" 에러가 발생한다.
SQL> EXEC DBMS_JAVA.GRANT_PERMISSION( ‘SCOTT’, ‘SYS:java.io.FilePermission’,'<<ALL FILES>>’, ‘read ,write, execute, delete’ );
SQL> CONN SCOTT/TIGER
SQL> SET SERVEROUTPUT ON
— 자바출력은 트레이스파일로 쓰여지므로, 출력을 화면에 표시하도록 변경후 프로시저 호출
SQL> CALL DBMS_JAVA.SET_OUTPUT(1000);
 
— 파일을 읽는 함수 호출
SQL> SELECT READ_FILE(‘E:/test.txt’) FROM DUAL;
READ_FILE(‘E:/TEST.TXT’)
——————————————-
2006년 8월 26일 Oracle Developer Day
 
— 파일명을 바꾸는 프로시저 호출
SQL> EXEC RENAME_FILE(‘E:/test.txt’, ‘E:/new.txt’);
파일명이 변경 되었습니다 –>E:\new.txt
PL/SQL 처리가 정상적으로 완료되었습니다.
–> 파일 이름이 변경되었는지 확인
 
— 바낀 파일을 패키지로 읽어 보겠습니다.
SQL> SELECT FILE_UTIL.READ_FILE(‘E:/new.txt’) FROM DUAL;
FILE_UTIL.READ_FILE(‘E:/NEW.TXT’)
————————————-
2006년 8월 26일 Oracle Developer Day
이 글은 [java]Tip 카테고리에 분류되었습니다. 고유주소 북마크.

댓글 남기기