在Oracle中调用Java Source 的方法

WBOY
풀어 주다: 2016-06-07 15:51:08
원래의
3290명이 탐색했습니다.

通常有三种方法来创建java存储过程。 一、手动编写Java存储过程/函数 利用SQL脚本代码,手动编写可供Oracle调用的Java存储过程或函数,和普通的存储过程/函数创建方法类,以存储过程为例,语法如下: CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED java_

通常有三种方法来创建java存储过程。

一、手动编写Java存储过程/函数

利用SQL脚本代码,手动编写可供Oracle调用的Java存储过程或函数,和普通的存储过程/函数创建方法类似,以存储过程为例,语法如下:

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED java_soure_name 

AS

示例:创建一个简单的Hello World输出过程,调用JavaSource实现

  1. 创建Java Source

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED OracleJavaProc
AS
public class OracleJavaProc
{
  public static void main(String[] args) 
	{
		System.out.println("Hello World!");
	}
}
로그인 후 복사

2.  创建存储过程 ,调用Java Source

CREATE OR REPLACE PROCEDURE testoraclejava
AS
LANGUAGE JAVA
NAME 'OracleJavaProc.main(java.lang.String [])';
로그인 후 복사

3.  调用存储过程

begin
  dbms_java.set_output(2000); ---设置Java输出缓冲区大小,否则无法输出数据
  testoraclejava;             ---调用存储过程
end;
로그인 후 복사
输出结果:Hello World!

二、使用外部class文件装载创建

将外部编译好的Java类文件(*.class)通过命令导入到数据库服务器中,实现Java存储过程的创建。

  1. 首先,既然要外部文件导入,那么就需要建立一个目录来存放*.class文件
  2. 其次,将编译好的class文件导入到服务器中
  3. 创建存储过程,调用导入的Java Source

创建目录和Java Source

SQL> create or   replace   directory   test_dir   as  'd:/oracle';  
 
目录已创建。  
 
SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.class')  
  2  /  
 
Java 已创建。 
로그인 후 복사

TIPS:如果第二步时出现:ORA-29516: Aurora 断言失败: Assertion failure at eox.c:359
Uncaught exception System error:   java/lang/UnsupportedClassVersionError 的错误,机器装了多个Java版本,oracle的Java版本低于环境变量设置的版本。

解决办法:用$ORACLE_HOME/jdk/bin/javac 重新编译java文件。

三、使用loadjava命令远程装载并创建

  • 先创建一个类:

import java.sql.*;  
import oracle.jdbc.*;  
 
public class OracleJavaProc {  
   //Insert a record to the database.  
   public static void insertRecord(int id, String name, int age ,String xman_id) {  
      System.out.println("Inserting new records for EMP...");  
      try 
	  {
		  Connection conn = DriverManager.getConnection("jdbc:default:connection:");  
          String sql = "INSERT INTO emp " +  
					   "(ID,NAME,SALARY,XMAN_ID) " +  
					   "VALUES(?,?,?,?)";
		  PreparedStatement pstmt = conn.prepareStatement(sql);  
		  pstmt.setInt(1,id);
		  pstmt.setString(2,name);
		  pstmt.setInt(3,age);
		  pstmt.setString(4,xman_id);
		  pstmt.executeUpdate();  
		  pstmt.close();
	  } 
	  catch(SQLException e) 
	  {
		  System.err.println("ERROR! Inserting record: " + e.getMessage());
	  }  
   }
   //Select a reords from database
   public static boolean recordQuery(int id) {
	   System.out.println("Querying records from EMP...");
	   try
	   {
		   Connection conn = DriverManager.getConnection("jdbc:default:connection:");
		   String sql = "SELECT * FROM emp WHERE id = ?";
		   PreparedStatement pstmt = conn.prepareStatement(sql);
		   pstmt.setInt(1,id);
		   ResultSet rs = pstmt.executeQuery();

		   while(rs.next()) {
			   System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+
								  rs.getInt(3)+"\t"+rs.getString(4));
		   }
		   return true;
	   }
	   catch (SQLException e)
	   {
		   System.err.println("ERROR! Querying record: " + e.getMessage());
		   return false;
	   }
   }
} 
로그인 후 복사
  • 使用loadjava命令将其装载到服务器端并编译:

D:\Oracle>loadjava -u hbi/hbi@orcl -v -resolve OracleJavaProc.java

arguments: '-u' 'hbi/hbi@orcl' '-v' '-resolve' 'OracleJavaProc.java'

creating : source OracleJavaProc

loading  : source OracleJavaProc

resolving: source OracleJavaProc

Classes Loaded: 0

Resources Loaded: 0

Sources Loaded: 1

Published Interfaces: 0

Classes generated: 0

Classes skipped: 0

Synonyms Created: 0

Errors: 0

  • 创建存储过程和函数:

创建存储过程,实现数据插入:

create or replace procedure INSERT_RECORD(V_ID      number,
                                          V_NAME    varchar2,
                                          V_SALARY  number,
                                          V_XMAN_ID varchar2) as
language java name 'OracleJavaProc.insertRecord(int,java.lang.String,int,java.lang.String)';
로그인 후 복사
创建函数,实现数据查询:

create or replace function QUERY_TABLE(v_id number) return number 
as
  language java name 'OracleJavaProc.recordQuery(int) return int';
로그인 후 복사
  • 测试一下结果:

SQL> set serveroutput on size 2000  
SQL> call dbms_java.set_output(2000);  
 
调用完成。  
 
SQL> execute add_salgrade(29, 'Charles', 5000, '029');  
Inserting new records for EMP...
 
PL/SQL 过程已成功完成。
로그인 후 복사

  在Oracle中调用Java Source 的方法

  • 更新你已经编写的Java存储过程

修改好Java源代码后,先dropjava ,再loadjava。

D:\Oracle>dropjava -u hbi/hbi@orcl -v OracleJavaProc
dropping: source OracleJavaProc

D:\Oracle>loadjava -u hbi/hbi@orcl -v -resolve OracleJavaProc.java
arguments: '-u' 'hbi/hbi@orcl' '-v' '-resolve' 'OracleJavaProc.java'
creating : source OracleJavaProc
loading  : source OracleJavaProc
resolving: source OracleJavaProc
Classes Loaded: 0
Resources Loaded: 0
Sources Loaded: 1
Published Interfaces: 0
Classes generated: 0
Classes skipped: 0
Synonyms Created: 0
Errors: 0


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿