[摘要:硬件情況: 1、操縱體系:win xp 2、數據庫:Oracle 10.2 3、裝置途徑:d:\oracle 4、測試class目次:d:\test 條件:若是是應用內部挪用Java順序的,確保oracle裝置目次下的j]
軟件環境:
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("jdbcracle:thin:user/pwd@127.0.0.1:1521rcl");
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哈哈~
|