天天看點

(轉)java 存儲過程或函數開發(總結)

(轉載位址:http://www.itpub.net/thread-399905-1-1.html)

有個需求,需要把oracle 資料庫中表的資料,變化的結果回報到消息伺服器中。

這裡的消息伺服器用的是active mq。

考慮到可以使用oracle java存儲過程實作這個功能。

經過一番辛苦。主要在破機器上折騰點了半天。

java 對記憶體的要求還是比較高的。

具體步驟如下:

java函數或存儲過程建立過程

調整資料庫初始化參數:  

*.java_max_sessionspace_size   =2073741824

*.java_soft_sessionspace_limit =104857600

*.java_pool_size=312m

*.utl_file_dir=*

環境變量:

$JAVA_HOME--must be set to the top directory of the installed JDK base

$PATH--requires $JAVA_HOME/bin

$LD_LIBRARY_PATH for Solaris must include $JAVA_HOME/lib

$CLASSPATH  must include $JAVA_HOME/lib

示例:

PATH=$ORACLE_HOME/jdk/bin:$ORACLE_HOME/bin:/bin:/usr/bin:/usr/ucb:/etc:/usr/openwin/bin:/usr/ccs/bin;export PATH

JAVA_HOME=$ORACLE_HOME/jdk;export JAVA_HOME

LD_LIBRARY_PATH=$JAVA_HOME/lib;export LD_LIBRARY_PATH

CLASSPATH=$JAVA_HOME/lib;export CLASSPATH

java -version

看看jdk 的版本.

我這裡用的必須是1.4.

建立使用者:

建立立使用者UJAVA

UJAVA 使用者需要單獨的表空間.

授權:

以sys使用者授權

execute dbms_java.grant_permission( 'UJAVA', 'SYS

(轉)java 存儲過程或函數開發(總結)

racle.aurora.security.JServerPermission', 'Verifier', '' );

execute dbms_java.grant_permission( 'UJAVA', 'SYS:java.net.SocketPermission', '172.18.10.116:61616', 'accept, connect,

listen, resolve' );

具體授權根據情況而定.

上面的授權語句都是在loadjava 和後來執行中總結出來的.

注:如果,出現權限問題,就把下面的腳本全部執行.

execute dbms_java.grant_permission('UJAVA','java.util.PropertyPermission','*','*');

execute dbms_java.grant_permission('UJAVA','java.io.SerializablePermission','*','*');

execute dbms_java.grant_permission('UJAVA','java.io.FilePermission','*','*');

execute dbms_java.grant_permission('UJAVA','java.net.NetPermission','*','*');

execute dbms_java.grant_permission('UJAVA','java.net.SocketPermission','*','*');

execute dbms_java.grant_permission('UJAVA','java.lang.RuntimePermission','*','*');

execute dbms_java.grant_permission('UJAVA','java.lang.reflect.ReflectPermission','*','*');

execute dbms_java.grant_permission('UJAVA','java.security.SecurityPermission','*','*');

execute dbms_java.grant_permission('UJAVA','oracle.aurora.rdbms.security.PolicyTablePermission','*','*');

execute dbms_java.grant_permission('UJAVA','oracle.aurora.security.JServerPermission','*','*');

加載jar包到資料庫:

所有這些jar包用ftp binary方式提供。

loadjava -u ujava/[email protected] -v  -o -noverify  -f jdom.jar     commons-logging-1.0.3.jar    commons-cli-1.0.jar 

commons-configuration-1.0-dev.jar    geronimo-spec-jms-1.1-rc4.jar        geronimo-spec-j2ee-management-1.0-rc4.jar   

concurrent-1.3.4.jar activemq-core-3.0.jar        log4j-1.2.8.jar      jce1_2_1.jar         jakarta-regexp-1.3.jar      

servlet.jar  activeio-1.0.jar     geronimo-spec-j2ee-jacc-1.0-rc4.jar  geronimo-spec-jta-1.0.1B-rc4.jar     spring-1.1.jar   

   jmssyn.jar  

loadjava -u ujava/[email protected] -v  -o -noverify  -r jdom.jar     commons-logging-1.0.3.jar    commons-cli-1.0.jar 

commons-configuration-1.0-dev.jar    geronimo-spec-jms-1.1-rc4.jar        geronimo-spec-j2ee-management-1.0-rc4.jar   

concurrent-1.3.4.jar activemq-core-3.0.jar        log4j-1.2.8.jar      jce1_2_1.jar         jakarta-regexp-1.3.jar      

servlet.jar  activeio-1.0.jar     geronimo-spec-j2ee-jacc-1.0-rc4.jar  geronimo-spec-jta-1.0.1B-rc4.jar     spring-1.1.jar   

   jmssyn.jar  

編譯無效的對象:

Select 'alter java class   "'||dbms_java.longname (object_name)||'" resolve;' from user_objects

   where object_type = 'JAVA CLASS' and status = 'INVALID';

該語句的執行結果反複執行,直到剩下的無效的對象不能在編譯成功為止.

可以從試圖user_errors查詢編譯錯誤.

建立java類:

見dataprocess.jsp腳本.

#這個檔案不友善提供了。

該腳本需要在pl/sql develop 的java source視窗中執行.

建立調用java類的函數或存儲過程:

CREATE OR REPLACE Function test_java(Name Varchar2) Return Varchar2

AS LANGUAGE Java

NAME ' DataProcess.deal(java.lang.String  )  return  java.lang.String';

使用java函數:

set serveroutput on size 5000;

execute dbms_java.set_output(2000);

這個指令用于調試java存儲過程

在$ORACLE_BASE/admin/$ORACLE_SID/dump目錄中會出現trc檔案.

ALTER SESSION SET EVENTS '10046 trace name context forever, level 4';

不知道java在資料庫如何調試,隻好如此了。

select test_java('y') from dual;