您的位置:首页 > 数据库 > Oracle

Oracle中使用Java存储过程

2009-12-10 15:10 561 查看



参考文档

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

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

注意:

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

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

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

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

[title3]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过程/函数的参数定义为含有out,nocop时候是不能引用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过程/函数和同1个java方法对应。只有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;

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

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

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

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

说明:

数据库用户名称= apple

密码= apple

Oracle tns 名称= wdzdb

3需要了解java和oracle数据类型的对照关系

类别

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



[/title3]

其他参考:

http://www.diybl.com/course/7_databases/oracle/oraclejs/200838/103247.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: