• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

在Oracle中调用Java Source 的方法

mysql 搞代码 4年前 (2022-01-09) 23次浏览 已收录 0个评论
文章目录[隐藏]

通常有三种方法来创建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 OracleJavaProcASpublic class OracleJavaProc{  public static void main(String[] args) 	{		System.out.println("Hello World!");	}}

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

CREATE OR REPLACE PROCEDURE testoraclejavaASLANGUAGE JAVANAME '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 Orac本文来源gaodai#ma#com搞*!代#%^码$网!leJavaProc

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) aslanguage 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 过程已成功完成。

  • 更新你已经编写的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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:在Oracle中调用Java Source 的方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址