Java Stored Procedure 예제 Enjoy/JAVA2012. 7. 20. 15:12
출처 : http://do3ng.wordpress.com/2007/08/13/java-stored-procedure-%EB%A7%8C%EB%93%A4%EA%B8%B0/
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