Oracle中使用Java存储过程

 

参考文档

 

《oracle 8i PL/SQL高级程序设计》机械工业出版社

 

PL/SQL Developer下建立 PL/SQL调用 JAVA程序。

 

注意:

 

只有java类的类方法发布到oracle数据库中, 才能被PLSQL访问;这是因为所有的PLSQL

 

子程序/函数都是类方法。

 

当然java中的实例方法,也是可以加载oracle数据库中的,而且也可以在PLSQL子程序/函数

 

引用java中的实例方法,但是当实际使用这个方法的时候,数据库才会给出错误提示。

 

1下面是1个例子

 

1.1编写java代码

 

例如:

 

create or replace and compile java source named wdzjava as
public class wdzjava
{
public static String entry(String a )
{
return
""+a+"String";
}
}

 

然后在PL/SQL Developer下编译执行了。

 

1.2编写PL/SQL过程/函数对应的代码。

 

1.2.1参数说明需要全限定名

 

PL/SQL过程/函数定义引用java类的类方法时,java方法的参数说明需要使用全限定名称。

 

例子:

 

create or replace function aaa(a varchar2) RETURN VARCHAR2 as
LANGUAGE JAVA NAME
'wdzjava.entry(java.lang.String) return java.lang.String';

 

注意上面的代码不可以定义为

 

create or replace function aaa(a varchar2) RETURN VARCHAR2 as
LANGUAGE JAVA NAME
'wdzjava.entry(String) return String';

 

注意:

 

1.2.2关于参数的 in ,out,nocopy 问题

 

当一个PL/SQL过程/函数的参数定义为含有outnocop时候是不能引用java类的方法的。像下面的代码是不能通过编译的。如果要使用out或者in out ,需要PL/SQL过程/函数的out或者in out参数对应java类方法的数组参数。

 

create or replace function WdzJavaTest_test(p_str in out varchar2) return varchar2 as
language java name 'WdzJavaTest.test(java.lang.String) return java.lang.String'
;

 

1.2.3java方法中的数组参数

 

java方法中的数组参数和PL/SQL过程/函数的参数的对应可以采用重载的方式定义一个或者多个PL/SQL过程/函数和同1java方法对应。只有main方法才可以定义数组形式,并且使用到PL/SQL过程/函数中去。对于其他java类方法的数组参数,需要PL/SQL过程/函数的out或者in out参数与之对应。

 

例如下面的例子。

 

1. java代码

 

 

create or replace and compile java source named WdzjavaTest as
public class WdzjavaTest
{
public static String test(String a )
{
a = a+"001";
return ""+a+"String";
}
public static String getAStr(String [] a){
int i=0
;
String s="aaaaaa";
a[
0] = a[0
] +"sex";
s = s + a[
0
];
return s;
}
public static void main(String [] a){
int i=
0
;
String s="aaaaaa";
for (i=
1
;i==a.length;i++){
s = s+","+a[i-
1
];
}
System.out.println("s="+s);
}
}

 

2. 在包内定义若干函数/过程实现调用 java的带有数组参数的方法

 

注意下面的getAStr方法调用是不能成功的。

 

---在包内定义若干函数/过程实现调用 java的带有数组参数的方法
CREATE OR REPLACE PACKAGE Pkg_WdzJavaTest AS
---在包内定义若干函数/过程实现调用 java的带有数组参数的方法

function test(p_Str varchar2) RETURN varchar2 IS
language java
name
'WdzjavaTest.test(java.lang.String) return java.lang.String';
function getAStr(p_Str varchar2) return varchar2 IS
language java
name
'WdzjavaTest.getAStr(java.lang.String[]) return java.lang.String'
;
function getAStr(p_Str varchar2,p_Str2 varchar2) return varchar2 IS
language java
name
'WdzjavaTest.getAStr(java.lang.String[]) return java.lang.String'
;
function getAStr(p_Str varchar2,p_Str2 varchar2,p_Str3 varchar2) return varchar2 IS
language java
name
'WdzjavaTest.getAStr(java.lang.String[]) return java.lang.String'
;

function getAStrwdz(p_Str in out varchar2) return varchar2 IS
language java
name
'WdzjavaTest.getAStr(java.lang.String[]) return java.lang.String'
;

procedure main(p_Str varchar2) IS
language java
name
'WdzjavaTest.main(java.lang.String[])'
;
procedure main(p_Str varchar2,p_Str2 varchar2) IS
language java
name
'WdzjavaTest.main(java.lang.String[]) '
;
procedure main(p_Str varchar2,p_Str2 varchar2,p_Str3 varchar2) IS
language java
name
'WdzjavaTest.main(java.lang.String[]) '
;
END ;

 

3.测试

 

declare
s varchar2(100
);
s2 varchar2(
100
);
begin
s := pkg_wdzjavatest.test(
'wdz test'
);
dbms_output.put_line(
' pkg_wdzjavatest.test='
||s);
pkg_wdzjavatest.main(
'test main(s)'
);
pkg_wdzjavatest.main(
'test main str1','test main str2'
);
pkg_wdzjavatest.main(
'test main str1','test main str2','test main str3');

 

--pkg_wdzjavatest.getAStr('test main(s)'); 不能使用
--pkg_wdzjavatest.getAStr('test main str1','test main str2'
); 不能使用
s2 :=
'aaa'
;
dbms_output.put_line(
' pkg_wdzjavatest.getAStrwdz input String value='
||s2);
s := pkg_wdzjavatest.getAStrwdz(s2);
dbms_output.put_line(
' pkg_wdzjavatest.getAStrwdz input String return value='||s2||',result='
||s);
end;

 

 

 

1.2.4使用PL/SQL过程去调用java类函数方法

 

---定义一个java类函数
create or replace and compile java source named JReturn as
class JReturn
{
// Simply returns its parameter.
static public String theFunc(String p,String [] sss)
{
sss[
0]= p;
return p;
}
}

 

--使用PL/SQL过程去调用java类函数方法(带有返回参数值)
create or replace procedure JReturn2(p_Parameter IN VARCHAR2,p_sss out varchar2)
AS
LANGUAGE JAVA
NAME
'JReturn.theFunc(java.lang.String,java.lang.String[])';

 

 

--测试调用java类的函数(带返回结果的类方法)
declare
a varchar2(
200):='aaaaa';
b varchar2(
200) := 'xxx'
;
begin
jreturn2(a,b);
dbms_output.put_line(b);
end;

 

2dos环境下加载一个类文件到oralce数据库

 

e:DateUtilsWDZ.java文件加载到数据库

 

dos环境输入(注意loadjava是oracle的带的一个java加载工具)下面的命令。

 

loadjava -user apple/apple@wdzdb -resolve -v e:DateUtilsWDZ.java

 

 

 

说明:

 

数据库用户名称= apple

 

密码= apple

 

Oracle tns 名称= wdzdb

 

 

 

3需要了解javaoracle数据类型的对照关系

 

类别

 

PL/SQL类型

 

Java类型

 

日期

 

date

 

oracle.sql.Date,java.sql.Date,

 

Java.sql.Timestamp

 

blob

 

Blob

 

oracle.sql.Blob,oracle.jdbc2.Blob

 

clob

 

clob

 

oracle.sql.Clob, oracle.jdbc2.Clob

 

对象

 

Object

 

Oracle.sql.Struct, oracle.jdbc2.Struct

 

集合

 

Array,Table

 

Oracle.sql.Array, oracle.jdbc2. Array

 


其他参考:

http://www.diybl.com/course/7_databases/oracle/oraclejs/200838/103247.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值