一、如何建立java存儲過程?
通常有三種方法來建立java存儲過程。
e.g. 使用create or replace and compile java source named "<name>" as
後邊跟上java源程式。要求類的方法必須是public static的,才能用于存儲過程。
sql> create or replace and compile java source named "javademo1"
2 as
3 import java.sql.*;
4 public class javademo1
5 {
6 public static void main(string[] argv)
7 {
8 system.out.println("hello, java demo1");
9 }
10 }
11 /
java 已建立。
sql> show errors java source "javademo1"
沒有錯誤。
sql> create or replace procedure javademo1
3 language java name 'javademo1.main(java.lang.string[])';
4 /
過程已建立。
sql> set serveroutput on
sql> call javademo1();
調用完成。
sql> call dbms_java.set_output(5000);
hello, java demo1
調用完成。
2、使用外部class檔案來裝載建立
public class oraclejavaproc
{
public static void main(string[] argv)
{
system.out.println("it's a java oracle procedure.");
}
}
sql> grant create any directory to scott;
授權成功。
sql> conn scott/[email protected]
已連接配接。
sql> create or replace directory test_dir as 'd:/oracle';
目錄已建立。
sql> create or replace java class using bfile(test_dir, 'oraclejavaproc.class')
2 /
sql> create or replace procedure testjavaproc as language java name 'oraclejavaproc.main(java.lang.string[])';
sql> call testjavaproc();
sql> execute testjavaproc;
pl/sql 過程已成功完成。
sql> set serveroutput on size 5000
it's a java oracle procedure.
3、我推薦的一種方法,直接使用loadjava指令遠端裝載并建立。
先建立一個類, e.g.
import java.sql.*;
import oracle.jdbc.*;
public class oraclejavaproc {
//add a salgrade to the database.
public static void addsalgrade(int grade, int losal, int hisal) {
system.out.println("creating new salgrade for employee...");
try {
connection conn =
drivermanager.getconnection("jdbc:default:connection:");
string sql =
"insert into salgrade " +
"(grade,losal,hisal) " +
"values(?,?,?)";
preparedstatement pstmt = conn.preparestatement(sql);
pstmt.setint(1,grade);
pstmt.setint(2,losal);
pstmt.setint(3,hisal);
pstmt.executeupdate();
pstmt.close();
}
catch(sqlexception e) {
system.err.println("error! adding salgrade: "
+ e.getmessage());
}
}
使用loadjava指令将其裝載到伺服器端并編譯:
d:eclipse3.1workspacedbtest>loadjava -u scott/[email protected] -v -resolve or
aclejavaproc.java
arguments: '-u' 'scott/[email protected] '-v' '-resolve' 'oraclejavaproc.java'
creating : source oraclejavaproc
loading : source oraclejavaproc
resolving: source oraclejavaproc
查詢一下狀态:
連接配接到:
oracle9i enterprise edition release 9.2.0.1.0 - production
with the partitioning, olap and oracle data mining options
jserver release 9.2.0.1.0 - production
sql> select object_name, object_type, status from user_objects where object_type like 'java%';
object_name
--------------------------------------------------------------------------------
object_type status
------------------------------------ --------------
oraclejavaproc
java class valid
java source valid
測試一下存儲過程:
sql> create or replace procedure add_salgrade(id number, losal number, hisal num
ber) as language java name 'oraclejavaproc.addsalgrade(int, int, int)';
sql> set serveroutput on size 2000
sql> call dbms_java.set_output(2000);
sql> execute add_salgrade(6, 10000, 15000);
creating new salgrade for employee...
sql> select * from salgrade where grade=6;
grade losal hisal
---------- ---------- ----------
6 10000 15000
二、如何更新你已經編寫的java存儲過程?
假如要往類oraclejavaproc裡添加一個存儲過程方法,如何開發?
正确的步驟應該是先dropjava, 改程式,再loadjava。
e.g.修改oraclejavaproc類内容如下:
// add a salgrade to the database.
public static int gethisal(int grade)
{
try {
connection conn =
drivermanager.getconnection("jdbc:default:connection:");
string sql = "select hisal from salgrade where grade = ?";
preparedstatement pstmt = conn.preparestatement(sql);pstmt.setint(1, grade);
resultset rset = pstmt.executequery();
int res = 0;
if (rset.next())
{
res = rset.getint(1);
}
rset.close();
return res;
}
catch (sqlexception e)
system.err.println("error! querying salgrade: "
return -1;
}
如何更新呢?
d:eclipse3.1workspacedbtest>dropjava -u scott -v oraclejavaproc
d:/[email protected]>loadjava -u scott -v -resolve or
aclejavaproc/[email protected]
arguments: '-u' 'scott/[email protected]' '-v' '-resolve' 'oraclejavaproc.java'
後邊的應用示例:
sql> create or replace function query_hisal(grade number) return number as langu
age java name 'oraclejavaproc.gethisal(int) return int';
函數已建立。
sql> select query_hisal(5) from dual;
query_hisal(5)
--------------
9999
全文完!
用法個人見解:不要手動drop java source,不要手動drop procedure。
本文出自seven的測試人生公衆号最新内容請見作者的github頁:http://qaseven.github.io/