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
|