有多个返回值的存储过程-非列表模式
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
plsql代码
--有输入和输出的存储过程(返回多个值)
create or replace procedure sun_pro12
(sunNo in number,sunName out varchar2,sunSal out number,sunJob out varchar) is
begin
select ename,sal,job into sunName,sunSal,sunJob from kkkk where empno=sunNo;
end;
java代码
public class Test1 {
public static void main(String[] args) {
Connection ct = null;
CallableStatement cs = null;
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
//2.创建CallableStatement,专门用来调用存储过程
//看看如何调用有返回值的过程
//创建CallableStatement
cs = ct.prepareCall("{call sun_pro12(?,?,?,?)}");
//给第一个?赋值
cs.setInt(1, 7788);
//给第二个?赋值
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
//oracle.jdbc.OracleTypes选定的类型取决于第二个问号是什么类型的
cs.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);
//执行
cs.execute();
//取出返回值,要注意?的位置
String name = cs.getString(2);
double sal = cs.getDouble(3);
String job = cs.getString(4);
System.out.println("7788的名字:"+name+'\t'+"工资:"+sal+'\t'+"职位:"+job);
} catch (Exception e) {
e.printStackTrace();
}
finally{
//关闭各个打开的资源
try {
cs.close();
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}