您好,欢迎访问一九零五行业门户网

在Oracle中调用Java Source 的方法

通常有三种方法来创建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实现
创建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存储过程的创建。
首先,既然要外部文件导入,那么就需要建立一个目录来存放*.class文件其次,将编译好的class文件导入到服务器中创建存储过程,调用导入的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) 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
其它类似信息

推荐信息