달력

4

« 2024/4 »

  • 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
2012. 7. 20. 15:12

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

:
Posted by 라면스프