設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 557|回復: 0
打印 上一主題 下一主題

oracle調用外部java程序代碼

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2019-9-22 05:42:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
[摘要:硬件情況: 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哈哈~


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-6-1 10:08 , Processed in 0.204833 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表