**********************使用java调用存储过程***********************
CallableStatement 这个通道可以用来调用存储过程
演示代码:
public class SQLUtil {
private Connection conn;
public SQLUtil(){
conn = ConnOracle.getConnection();
}
public void callProcedure(){
//3.建立通道
String sql = "{call proc_increase_salary(?,?)}";
CallableStatement cstmt = null;
try {
cstmt = conn.prepareCall(sql);
cstmt.setInt(1, 10);//给10号部门涨工资
cstmt.registerOutParameter(2, Types.VARCHAR);
//4.执行并返回结果集
cstmt.executeUpdate();
System.out.println("执行存储过程成功");
String desc = cstmt.getString(2);
System.out.println(desc);
} catch (SQLException e) {
System.out.println("建立通道失败");
e.printStackTrace();
}finally{
//5.关闭
ConnOracle.closeConnection(null, cstmt, conn);
}
}
public static void main(String[] args) {
SQLUtil util = new SQLUtil();
util.callProcedure();
}
}
存储过程的代码:
create or replace procedure proc_increase_salary(v_deptno in number,v_desc out varchar)
is
cursor c(v_deptno1 emp.deptno%type) is
select ename,sal from emp where deptno=v_deptno1 for update;
v_sal number(7,2);
v_count number(10):=0;
begin
for v_temp in c(v_deptno) loop
v_sal:=v_temp.sal;
if(v_sal<1200) then
--涨500
update emp set sal=sal+500 where current of c;
v_count:=v_count + SQL%rowcount;
elsif(v_sal<1500) then
--涨300
update emp set sal=sal+300 where current of c;
v_count:=v_count + SQL%rowcount;
else
--涨100
update emp set sal=sal+100 where current of c;
v_count:=v_count + SQL%rowcount;
end if;
end loop;
v_desc:= '总共更新了' ||v_count||'条记录';
end;
declare
v_desc varchar2(50);
begin
proc_increase_salary(10,v_desc);
dbms_output.put_line(v_desc);
end;
**********************封装一个方法可以执行任何SQL语句(除DQL)***********************
1. stmt.executeUpdate();// DML语句返回受影响的行数,DDL或DCL返回0
2. ResultSet rs = stmt.executeQuery();//执行DQL语句
3. boolean flag = stmt.execute();// true 表示执行的是DQL语句 false表示执行的是DML、DDL语句
可以通过判断返回值来获知用户执行的是哪种类型的语句
通道对象
getResultSet();//获得执行的结果集
getUpdateCount();//获得受影响的行数
*********************JDBC的3种通道**************************************
1. PreparedStatement
预编译的通道
SQL语句固定不变的时候 增、删、改、查1, 效率高
第一次 SQL 1.编译 2.运行
第二次 只发参数
(1)网络中只传输参数 不用传整条SQL 传输的字节数少了 效率高
(2)不需要从新编译了 直接运行 所以效率高
2. Statement
普通的通道
SQL经常发生改变的时候 按sql查 执行任何除DQL以外的所有SQL
3. CallableStatement
专门用来调用存储过程的通道