Table of Contents
一、手动编写Java存储过程/函数
二、使用外部class文件装载创建
三、使用loadjava命令远程装载并创建
Home Database Mysql Tutorial 在Oracle中调用Java Source 的方法

在Oracle中调用Java Source 的方法

Jun 07, 2016 pm 03:51 PM
java oracle source method transfer

通常有三种方法来创建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!");
	}
}
Copy after login

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

CREATE OR REPLACE PROCEDURE testoraclejava
AS
LANGUAGE JAVA
NAME 'OracleJavaProc.main(java.lang.String [])';
Copy after login

3.  调用存储过程

begin
  dbms_java.set_output(2000); ---设置Java输出缓冲区大小,否则无法输出数据
  testoraclejava;             ---调用存储过程
end;
Copy after login
输出结果: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 已创建。 
Copy after login

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;
	   }
   }
} 
Copy after login
  • 使用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)';
Copy after login
创建函数,实现数据查询:

create or replace function QUERY_TABLE(v_id number) return number 
as
  language java name 'OracleJavaProc.recordQuery(int) return int';
Copy after login
  • 测试一下结果:

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 过程已成功完成。
Copy after login

  在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


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Perfect Number in Java Perfect Number in Java Aug 30, 2024 pm 04:28 PM

Perfect Number in Java

Random Number Generator in Java Random Number Generator in Java Aug 30, 2024 pm 04:27 PM

Random Number Generator in Java

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Weka in Java

Smith Number in Java Smith Number in Java Aug 30, 2024 pm 04:28 PM

Smith Number in Java

Java Spring Interview Questions Java Spring Interview Questions Aug 30, 2024 pm 04:29 PM

Java Spring Interview Questions

Break or return from Java 8 stream forEach? Break or return from Java 8 stream forEach? Feb 07, 2025 pm 12:09 PM

Break or return from Java 8 stream forEach?

Java Made Simple: A Beginner's Guide to Programming Power Java Made Simple: A Beginner's Guide to Programming Power Oct 11, 2024 pm 06:30 PM

Java Made Simple: A Beginner's Guide to Programming Power

Create the Future: Java Programming for Absolute Beginners Create the Future: Java Programming for Absolute Beginners Oct 13, 2024 pm 01:32 PM

Create the Future: Java Programming for Absolute Beginners

See all articles