티스토리 뷰

반응형

Java Stored Procedure 만들기 

 

1. Writing the Java Classes 

- Java 소스 생성 

 

2. Load and Resolve the Java Classes 

 - loadjava 를 이용하여 class 를 DB 에 Load 

 

3. Publish the Java Classes 

 - load된 자바 클래스를 이용하여 오라클 프로시저/함수 만들기 

 

4. Cll the Stored Procedures or Functions 

 - 프로시저 또는 함수를 사용 

 

예제 : http://www.oracleclub.com/odd/20060826/jsp_exam.html

 

Java Stored Procedure 예제

  Java Stored Procedure는 웹 개발시 배치잡(Batch Job) 형태의 작업이나, 많은 데이터의 작업이 필요한 경우 뛰어난 성능 향상을 가져 올 수 있습니다. 또한 PL/SQL로 구현하기 어려우나 Java로 구현이 편리할 경우(예를 들어 OS 파일 핸들링, 암호화..) 사용하면 성능 향상과 동시에 편리하게 사용 할 수 있습니다.

  아래 예저는 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


 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함