Java代码调用存储过程和函数步骤(以下以maven工程为例):
第一步,pom.xml文件,引入jar包:ojdbc6、testng
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
</dependency>
第二步,新建JdbcUtils.class文件,创建JDBC工具类
import java.sql.*;
/**
* JDBC工具类 ,一般工具类final。
* 工具类一般不需要new,不需要构造实例。(把构造方法私有)别人就new不了了。
* 此时使用类的方法:
* 1是单例模式(复杂点)
* 2是提供静态的public方法。(简单)
* 本例子是简单的提供public方法实现的。需要静态方法
*/
public final class JdbcUtils {
private static String url ="jdbc:oracle:thin:@**.**.**.**:1521:orcl";
private static String user ="XXX";
private static String passWord = "XXX";
//构造方法私有,别人不能构造,不会有实例出来.
private JdbcUtils(){
}
/**
* 静态代码块,类加载到虚拟机是只执行一次。
*/
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url,user,passWord);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//释放资源,重载方法。
public static void close(Connection conn) {
try {
if(conn != null){
conn.close();
conn = null;
}
}catch(SQLException e){
e.printStackTrace();
}
}
public static void close(Statement stmt){
try{
if(stmt != null){
stmt.close();
stmt = null;
}
}catch(SQLException e){
e.printStackTrace();
}
}
public static void close(ResultSet rs){
try{
if(rs != null){
rs.close();
rs = null;
}
}catch (SQLException e) {
e.printStackTrace();
}
}
}
第三步,创建JAVA调用Oracle的存储过程和函数的测试类OracleTest.class,需要使用CallableStatement接口。
具体操作如下。
1.JAVA调用无返回值的存储过程
1)创建存储过程
create or replace procedure pro_model (modelid in varchar2,seriesid out varchar2,modelname out varchar2)
as
begin
select m.vehicle_series_id,m.vehicle_sub_model_name into seriesid,modelname
from t_md_vehicle_model m
where m.vehicle_sub_model_id=modelid
and m.valid_flag=1;
end;
2)在测试类中添加以下方法
@Test
public void testProcedure1(){
//格式 {call <procedure-name>[(<arg1>,<arg2>, ...)]}
String sql = "{call pro_model(?,?,?)}";
Connection conn = null;
CallableStatement call = null;
try {
conn = JdbcUtils.getConnection();
call = conn.prepareCall(sql);
//赋值
call.setString(1, "CN130010202");
//对于out参数,声明
call.registerOutParameter(2, OracleTypes.VARCHAR);
call.registerOutParameter(3, OracleTypes.VARCHAR);
//调用
call.execute();
//取值
String id = call.getString(2);
String name = call.getString(3);
System.err.println(id);
System.err.println(name);
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.close(call);
JdbcUtils.close(conn);
}
}
3)右键执行测试,结果如下
image.png
2.JAVA调用有返回值的存储过程
1)创建存储过程
create or replace procedure
pro_model_list (seriesid in varchar2,modelList out SYS_REFCURSOR)is
begin
open modelList for
select m.model_id,m.model_name from t_model m
where m.series_id=seriesid
and m.valid_flag=1;
end ;
2)在测试类中添加以下方法
@Test
public void testProcedure2(){
//格式 {call <procedure-name>[(<arg1>,<arg2>, ...)]}
String sql = "{call pro_model_list(?,?)}";
Connection conn = null;
CallableStatement call = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
call = conn.prepareCall(sql);
//赋值
call.setString(1, "13001");
//对于out参数,声明
call.registerOutParameter(2, OracleTypes.CURSOR);
//调用
call.execute();
rs = ((OracleCallableStatement)call).getCursor(2);
while(rs.next()){
String id = rs.getString("model_id");
String name = rs.getString("model_name");
System.err.println("modelid:"+id+",modelname:"+name);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.close(call);
JdbcUtils.close(conn);
}
}
3)右键执行测试,结果如下
image.png
3.JAVA调用有返回值的函数
1)创建函数
create or replace function getCompareResults(para1 number, para2 number) return number
as
begin
if para1 > para2 then
return para1;
else
return para2;
end if;
end;
2)在测试类中添加以下方法
@Test
public void testFunction(){
//{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
//第一个?--> 输出参数,返回值, 第二个 ?-->输入参数
String sql = "{?= call getCompareResults(?,?)}";
Connection conn = null;
CallableStatement call = null;
try {
conn = JdbcUtils.getConnection();
call = conn.prepareCall(sql);
//注册输出参数
call.registerOutParameter(1, OracleTypes.NUMBER);
//输入参数
call.setInt(2, 7839);
call.setInt(3, 7139);
//执行
call.execute();
//取出结果,注意是get 1
int result = call.getInt(1);
System.err.println("比较大小结果为::"+result+" 大。");
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.close(call);
JdbcUtils.close(conn);
}
}
3)右键执行测试,结果如下
image.png
网友评论