软件环境:
1、操作系统:win xp
2、数据库:oracle 10.2
3、安装路径:d:\oracle
4、测试class目录:d:\test
前提:如果是使用外部调用java程序的,确保oracle安装目录下的jdk和你编译的jdk版本一致。要不会报找不到class异常的。同时也确保把class文件放至数据库服务器硬盘中。
实现方法:
1、创建一java文件:OraclejavaProc.java
1 public class OraclejavaProc {
2 public static void main(String[] args) {
3 System.out.println("It's a oraclejavaproc!");
4 }
5 }
2、使用oracle目录下的D:\oracle\product\10.2.0\db_1\jdk\bin javac来编译
javac OraclejavaProc.java
3、java OraclejavaProc 测试一下是否可成功输出信息。
4、登录oracle (可使用sql*plus或plsql)
1 SQL> conn system/manager
2 SQL> grant create any directory to scott; --授权
3 SQL> conn scott/tiger ---如果是管理员登录操作的可省略此步
4 SQL> create or replace directory oracle_dir as 'd:\test';
5 --目录已创建。
6 SQL> create or replace java class using bfile(oracle_dir,'OraclejavaProc.class');
7 Java 已创建。
8 --SQL> select object_name,object_type,STATUS from user_objects; --可查看object_type是否有java class的数据。
9 SQL> create or replace procedure oracle_java as language java
10 name 'OraclejavaProc.main(java.lang.String[])';
11 --过程已创建。
12 SQL> set serveroutput on size 5000 --使用pl/sql时此句可不用也可打印出
13 SQL> call dbms_java.set_output(5000);
14 --调用完成。
15 SQL> execute oracle_java;
16 It's a oraclejavaproc!
17
18 PL/SQL 过程已成功完成。
19 SQL> call test_java();
20 It's a oraclejavaproc!
21
22 --调用完成。
项目里,经常用到oracle里编写 java 类,调用存储过程,于是这篇文档闪亮登场!
具体步骤:
1、登陆某一用户登录,并创建java程序资源,在pl/sql中java source中显示你所编写的java代码;
create or replace and compile java source named bb_wx_replosssbk as
import java.sql.*;
import oracle.jdbc.driver.*;
public class bb_wx_replosssbk
{
/**
* 社保卡挂失
*/
public static String callProc(String sSfzh,String sPwd,String sType)
{
OracleDriver driver = new OracleDriver();
Connection connection=null;
CallableStatement cstmt=null;
String sRtn = "beg";
try
{
sRtn = " try beg";
connection = DriverManager.getConnection("jdbc:oracle:thin:user/pwd@127.0.0.1:1521:orcl");
sRtn = "con";
cstmt = connection.prepareCall("{call run_replosssbk(?,?,?,?)}");
sRtn = "invoke";
cstmt.setString(1, sSfzh);
cstmt.setString(2, sPwd);
cstmt.setString(3, sType);
cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
sRtn = "set value";
cstmt.executeUpdate();
sRtn = "execute";
sRtn = cstmt.getString(4);
}catch (Exception e) {
sRtn = e.toString();
e.printStackTrace();
}finally {
try {
if (cstmt != null) {
cstmt.close();
}
if (connection != null) {
connection.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
return sRtn;
}
}
2、创建调用Java资源的函数
create or replace function run_bb_wx_replosssbk(
sSfz in varchar2,
sPwd in varchar2,
sType in varchar2
)
return varchar2
as
language java name 'bb_wx_replosssbk.callProc(java.lang.String,java.lang.String,java.lang.String) return java.lang.String';
3、建立一过程调用存储过程
create or replace procedure RUN(
sSfz in varchar2,
sPwd in varchar2,
sType in varchar2
sRtn out varchar2
)
as
begin
--sRtn := run_bb_wx_replosssbk(sSfz in varchar2,sPwd in varchar2,sType in varchar2);
Select run_bb_wx_replosssbk(sSfz in varchar2,sPwd in varchar2,sType in varchar2)
Into sRtn from dual;
end;
/
呵呵,到此为止,基本步骤已经完成,如果你觉得现在可以顺利调用,孩子,醒醒吧,还有权限问题!!
网上抄了下面一段
begin
Dbms_Java.Grant_Permission('new','java.io.FilePermission', '<<ALL FILE>>','read ,write, execute, delete');
Dbms_java.grant_permission('new', 'SYS:java.io.FilePermission', '<<ALL FILES>>','read ,write, execute, delete');
Dbms_Java.Grant_Permission('new', 'java.io.FilePermission', 'd:a.bat','read ,write, execute, delete');
dbms_java.grant_permission('new', 'java.lang.RuntimePermission','*','writeFileDescriptor' );
end;
很神奇,上面一段不行!!不知道为啥……
还是用最简单的方法,用有管理员权限的用户登录pl/sql ,选择users,找到new用户,edit一下,选择Role privileges,加上javasyspriv权限和javauserpriv权限。
OK,到此为止,所有步骤已经完成,可以正常使用了,O(∩_∩)O哈哈~