Jdbc进阶(二)

**********************使用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


专门用来调用存储过程的通道

 

转载于:https://www.cnblogs.com/MrTanJunCai/p/9907507.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值