1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

其实,这篇短文,我早就应该写了。因为,Java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。

一、如何创建java存储过程?

通常有三种方法来创建java存储过程。

1. 使用oracle的sql语句来创建:

e.g. 使用create or replace and compile java source named "<name>" as

后边跟上java源程序。要求类的方法必须是public static的,才能用于存储过程。

SQL>createorreplaceandcompilejavasourcenamed"javademo1"
2as
3importjava.sql.*; 
4publicclassJavaDemo1 
5{ 
6publicstaticvoidmain(String[]argv) 
7{ 
8System.out.println("hello,javademo1"); 
9} 
10} 
11/ 

Java已创建。 

SQL>showerrorsjavasource"javademo1"
没有错误。 

SQL>createorreplaceprocedurejavademo1 
2as
3languagejavaname'JavaDemo1.main(java.lang.String[])'; 
4/ 

过程已创建。 

SQL>setserveroutputon
SQL>calljavademo1(); 

调用完成。 

SQL>calldbms_java.set_output(5000); 

调用完成。 

SQL>calljavademo1(); 
hello,javademo1 

调用完成。 

SQL>calljavademo1(); 
hello,javademo1 
调用完成。

2. 使用外部class文件来装载创建

e.g. 这里既然用到了外部文件,必然要将class文件放到oracle Server的某一目录下边。

publicclassOracleJavaProc 
{ 
publicstaticvoidmain(String[]argv) 
{ 
System.out.println("It'saJavaOracleprocedure."); 
} 
} 


SQL>grantcreateanydirectorytoscott; 

授权成功。 

SQL>connscott/tiger@iihero.oracledb 
已连接。 
SQL>createorreplacedirectorytest_diras'd:/oracle'; 

目录已创建。 

SQL>createorreplacejavaclassusingbfile(test_dir,'OracleJavaProc.CLASS') 
2/ 

Java已创建。 

SQL>createorreplaceproceduretestjavaprocaslanguagejavaname'OracleJavaProc.main(java.lang.String[])'; 
2/ 

过程已创建。 

SQL>calltestjavaproc(); 

调用完成。 

SQL>executetestjavaproc; 

PL/SQL过程已成功完成。 

SQL>setserveroutputonsize5000 
SQL>calldbms_java.set_output(5000); 

调用完成。 

SQL>executetestjavaproc; 
It'saJavaOracleprocedure.

3. 我推荐的一种方法,直接使用loadjava命令远程装载并创建。 先创建一个类, e.g.

importjava.sql.*; 
importoracle.jdbc.*; 

publicclassOracleJavaProc{ 

//Addasalgradetothedatabase. 
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal){ 

System.out.println("CreatingnewsalgradeforEMPLOYEE..."); 

try{ 
Connectionconn= 
DriverManager.getConnection("jdbc:default:connection:"); 

Stringsql= 
"INSERTINTOsalgrade"+ 
"(GRADE,LOSAL,HISAL)"+ 
"VALUES(?,?,?)"; 
PreparedStatementpstmt=conn.prepareStatement(sql); 
pstmt.setInt(1,grade); 
pstmt.setInt(2,losal); 
pstmt.setInt(3,hisal); 
pstmt.executeUpdate(); 
pstmt.close(); 
} 
catch(SQLExceptione){ 
System.err.println("ERROR!AddingSalgrade:" 
+e.getMessage()); 
} 
} 
}

使用loadjava命令将其装载到服务器端并编译:

D:eclipse3.1workspacedbtest>loadjava-uscott/tiger@iihero.oracledb-v-resolveOr 
acleJavaProc.java 
arguments:'-u''scott/tiger@iihero.oracledb'-v''-resolve''OracleJavaProc.java' 
creating:sourceOracleJavaProc 
loading:sourceOracleJavaProc 
resolving:sourceOracleJavaProc 

查询一下状态:

连接到: 
Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production 
WiththePartitioning,OLAPandOracleDataMiningoptions 
JServerRelease9.2.0.1.0-Production 

SQL>SELECTobject_name,object_type,statusFROMuser_objectsWHEREobject_typeLIKE'JAVA%'; 

OBJECT_NAME 
-------------------------------------------------------------------------------- 

OBJECT_TYPESTATUS 
-------------------------------------------------- 
OracleJavaProc 
JAVACLASSVALID 

OracleJavaProc 
JAVASOURCEVALID

测试一下存储过程:

SQL>createorreplaceprocedureadd_salgrade(idnumber,losalnumber,hisalnum 
ber)aslanguagejavaname'OracleJavaProc.addSalGrade(int,int,int)'; 
2/ 

过程已创建。 

SQL>setserveroutputonsize2000 
SQL>calldbms_java.set_output(2000); 

调用完成。 

SQL>executeadd_salgrade(6,10000,15000); 
CreatingnewsalgradeforEMPLOYEE... 

PL/SQL过程已成功完成。 

SQL>select*fromsalgradewheregrade=6; 

GRADELOSALHISAL 
------------------------------ 
61000015000

二、如何更新你已经编写的java存储过程?

假如要往类OracleJavaProc里添加一个存储过程方法,如何开发? 正确的步骤应该是先dropjava, 改程序,再loadjava。

e.g.修改OracleJavaProc类内容如下:

importjava.sql.*; 
importoracle.jdbc.*; 

publicclassOracleJavaProc{ 

//Addasalgradetothedatabase. 
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal){ 

System.out.println("CreatingnewsalgradeforEMPLOYEE..."); 

try{ 
Connectionconn= 
DriverManager.getConnection("jdbc:default:connection:"); 

Stringsql= 
"INSERTINTOsalgrade"+ 
"(GRADE,LOSAL,HISAL)"+ 
"VALUES(?,?,?)"; 
PreparedStatementpstmt=conn.prepareStatement(sql); 
pstmt.setInt(1,grade); 
pstmt.setInt(2,losal); 
pstmt.setInt(3,hisal); 
pstmt.executeUpdate(); 
pstmt.close(); 
} 
catch(SQLExceptione){ 
System.err.println("ERROR!AddingSalgrade:" 
+e.getMessage()); 
} 
} 
 
publicstaticintgetHiSal(intgrade) 
{ 
try{ 
Connectionconn= 
DriverManager.getConnection("jdbc:default:connection:"); 
Stringsql="SELECThisalFROMsalgradeWHEREgrade=?"; 
PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setInt(1,grade); 
ResultSetrset=pstmt.executeQuery(); 
intres=0; 
if(rset.next()) 
{ 
res=rset.getInt(1); 
} 
rset.close(); 
returnres; 
} 
catch(SQLExceptione) 
{ 
System.err.println("ERROR!QueryingSalgrade:" 
+e.getMessage()); 
return-1; 
} 
} 
 
}

如何更新呢?

D:eclipse3.1workspacedbtest>dropjava-uscott-vOracleJavaProc 

D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava-uscott-v-resolveOr
acleJavaProc/tiger@iihero.oracledb.java 
arguments:'-u''scott/tiger@iihero.oracledb''-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc 
loading:sourceOracleJavaProc 
resolving:sourceOracleJavaProc

后边的应用示例:

SQL>createorreplacefunctionquery_hisal(gradenumber)returnnumberaslangu 
agejavaname'OracleJavaProc.getHiSal(int)returnint'; 
2/ 

函数已创建。 

SQL>setserveroutputonsize2000 
SQL>calldbms_java.set_output(2000); 

调用完成。 
SQL>selectquery_hisal(5)fromdual; 

QUERY_HISAL(5) 
-------------- 
9999 

全文完!

用法个人见解:不要手动drop java source, 不要手动drop procedure。

本文来源:1818IP

本文地址:https://www.1818ip.com/post/12092.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。