资源描述
如何在Java程序中调用存储过程(一)?
(1) 使用scott/tiger用户在Oracle中创建2个表并插入几条数据。
Create table carl_test(A varchar2(200));
create table carl_test1(B varchar2(200));
--insert some data into carl_test1 table
insert into carl_test1 values('carl1');
insert into carl_test1 values('carl2');
insert into carl_test1 values('carl3');
commit;
(2) 使用scott/tiger用户在Oracle中创建一个测试存储过程,该存储过程有三个参数,第一个参数为输入参数,最后两个参数为输出参数。为简单起见,没有在该存储过程中加入异常捕获机制。
CREATE OR REPLACE PROCEDURE carl_sp_test
( v_monthly IN varchar2,
last_inserted_rows_num OUT number,
all_effected_rows_num OUT number)
IS
BEGIN
/*删除carl_test表中所有记录*/
delete carl_test;
/*将删除行数赋值给总影响行数*/
all_effected_rows_num := SQL%Rowcount;
commit;
/*将用户输入参数插入carl_test表中*/
insert into carl_test(a) values(v_monthly);
all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;
/*将表carl_test1中的所有记录插入到carl_test1中*/
insert into carl_test
select * from carl_test1;
/*获得影响记录数 */
last_inserted_rows_num:=SQL%Rowcount;
all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;
commit;
END carl_sp_test;
(3) 使用scott/tiger用户在SQL/Plus中测试上述存储过程
SQL> variable all_effected_rows_num number;
SQL> variable last_inserted_rows_num number;
SQL> exec carl_sp_test('first var',:last_inserted_rows_num,:all_effected_rows_num);
PL/SQL procedure successfully completed
last_inserted_rows_num
---------
3
all_effected_rows_num
---------
4
SQL> print last_inserted_rows_num;
last_inserted_rows_num
---------
3
SQL> print all_effected_rows_num;
all_effected_rows_num
---------
4
SQL>
上述结果表示测试成功
(4) 使用下面的Java类TestStoreProcedure.java测试存储过程。
package test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;
/**
* This class is used to test Oracle store procedure
* @author CarlWu
*
*/
public class TestStoreProcedure{
/**
* 测试主方法
* @param args
*/
public static void main(String[] args) {
Connection con=null;
try {
//获得数据库连接
java.lang.Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:scott/tiger@localhost:1521:LEGDB");
//测试存储过程
TestStoreProcedure sp=new TestStoreProcedure();
sp.execute(con,"carl_sp_test","carl");
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} catch (SQLException sqlE) {
sqlE.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally {
if (con != null) {
try {
con.close();
} catch (Exception e) {
}
}
}
}
/**
* 该方法用来调用Oracle存储过程
* @param con 数据库连接
* @param parameter传入存储过程的参数值
* @throws SQLException SQL 异常
*/
public void execute(Connection con,String sp_name, String parameter) throws SQLException{
//调用存储过程
CallableStatement callStat=con.prepareCall("{call "+sp_name+"(?,?,?)}");
//最后一次插入的行数
int last_inserted_rows=0;
//总影响行数
int all_effected_rows=0;
//设置输入参数值
callStat.setString(1, parameter);
//注册存储过程的第二、第三个参数类型
callStat.registerOutParameter(2, OracleTypes.NUMBER);
callStat.registerOutParameter(3, OracleTypes.NUMBER);
//执行存储过程
callStat.execute();
//从存储过程执行结果中获得第二、第三个参数值
last_inserted_rows=callStat.getInt(2);
all_effected_rows=callStat.getInt(3);
//关闭CallableStatement,释放资源
callStat.close();
//在控制台中打印结果
System.out.println("最后一次插入条数:"+last_inserted_rows);
System.out.println("总影响行数:"+all_effected_rows);
}
}
(5) 程序运行结果.
最后一次插入条数:3
总影响行数:8
展开阅读全文