Oracle觸發器反向調用Java程式

來源:互聯網
上載者:User

標籤:close   rmi   type   檔案   static   int   tco   types   版本   

匯入jar包 在oracle中匯入需要的jar包,我們把編輯好的java類打成jar包,直接在oarcle裡面寫簡單的調用就可以了,  1、作業系統需要擁有支援loadjava命令的jdk。  2、載入jlha.jar包,到oracle資料庫中。     操作過程:在dos環境下,輸入命令: loadjava   -r   -f   -o   -user   usscares/[email protected]   jlha.jar 注意:jar包要在1.4的環境下編譯,項目右鍵 properties java compiler compoler compliance level 1.4 即可   否則報version 49 類似的錯誤 調用JAVA類oracle調用JAVA類的方法主要有以下三種:用loadjava方法裝載;可能是調試方便,據說這種方法比較通用。c:\test\hello.javapublic class hello{    public static void main(String[] args)    {        System.out.println("Hello");        hello h = new hello();        h.insertM(9);    }    public static void insertM(int pid)    {        System.out.println("This is the method insertM.");    }} C:\test>loadjava -u test/[email protected] -v -resolve hello.javaSQL> create procedure prc_hehe as language java name ‘hello.main(java.lang.String[])過程已建立。SQL> call prc_hehe();調用完成。SQL> set serveroutput on size 2000SQL> call prc_hehe();調用完成。SQL> exec dbms_java.set_output(2000);PL/SQL 過程已成功完成。SQL> call prc_hehe();HelloThis is the method insertM.調用完成。SQL>show errors;修改java類,先刪除再裝載,方法:dropjava -u test/[email protected] -v -resolve hello.javaloadjava -u test/[email protected] -v -resolve hello.java用sql語句建立create or replace and compile java source named heheASpublic class hello{    public static void msg(String name)    {        System.out.println("hello," + name);    }}; create or replace procedure prc_hehe(       p_name VARCHAR2)aslanguage java name ‘hello.msg(java.lang.String)‘;-- 調用結果SQL> call prc_hehe(‘oopp‘);hello,oopp用外部class檔案來裝載建立create or replace directory CLASS_DIR  as ‘c:\test‘;create or replace java class using bfile(class_dir,‘hello.class‘);create or replace procedure prc_hello(       p_name VARCHAR2)aslanguage java name ‘hello.msg(java.lang.String)‘;-- 測試結果SQL> call prc_hello(‘java‘);java可能出現的錯誤SQL> call prc_hello(‘Jerry‘);call prc_hello(‘Jerry‘)     *第 1 行出現錯誤:ORA-29516: Aurora 宣告失敗: Assertion failure at eox.c:359Uncaught exception System error:   java/lang/UnsupportedClassVersionError原因:機器裝了多個java版本,oracle的java版本低於環境變數設定的版本。解決方案:用$ORACLE_HOME/jdk/javac 重新編譯java檔案核對java已經匯入資料庫select * from user_source where type LIKE ‘JAVA%‘ AND NAME = ‘<java file>‘建立functionCREATE OR REPLACE FUNCTION <FUNCTION_NAME> (<PARAMETER LIST IN ORACLE DATATYPE>) RETURN <ORACLE DATATYPE OF RETURN VARIABLE> AS   LANGUAGE JAVA   NAME ‘<clase.method>(<parameter list in java datatype>) return java datatype of return variable‘; 例:登陸某一使用者登入,並建立java程式資源,在pl/sql中java source中顯示你所編寫的java代碼;create or replace and compile java source named bb_wx_replosssbk asimport 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/[email protected]: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;    }}建立調用Java資源的函數create or replace function run_bb_wx_replosssbk(sSfz in varchar2,sPwd in varchar2,sType in varchar2)return varchar2as language java name ‘bb_wx_replosssbk.callProc(java.lang.String,java.lang.String,java.lang.String) return java.lang.String‘;建立一程序呼叫預存程序create or replace procedure RUN(sSfz in varchar2,sPwd in varchar2,sType in varchar2sRtn out varchar2)asbegin--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;/附:如果需要java存取檔案,需要使用dba使用者賦權EXEC Dbms_Java.Grant_Permission(‘ONBOARDING‘, ‘SYS:java.lang.RuntimePermission‘, ‘writeFileDescriptor‘, ‘‘);EXEC Dbms_Java.Grant_Permission(‘ONBOARDING‘, ‘SYS:java.lang.RuntimePermission‘, ‘readFileDescriptor‘, ‘‘);EXEC dbms_java.grant_permission( ‘ONBOARDING‘, ‘SYS:java.io.FilePermission‘, ‘<<ALL FILES>>‘, ‘execute‘ );收回許可權的語句如下EXEC Dbms_Java.revoke_Permission(‘ONBOARDING‘, ‘SYS:java.lang.RuntimePermission‘, ‘writeFileDescriptor‘, ‘‘);EXEC Dbms_Java.revoke_Permission(‘ONBOARDING‘, ‘SYS:java.lang.RuntimePermission‘, ‘readFileDescriptor‘, ‘‘);EXEC dbms_java.revoke_permission( ‘ONBOARDING‘, ‘SYS:java.io.FilePermission‘, ‘<<ALL FILES>>‘, ‘execute‘ );

 

Oracle觸發器反向調用Java程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.