nn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "0108");
CallableStatement cs = conn.prepareCall("{call sp_pro7(?,?,?)}");
//给?赋值
cs.setInt(1, 10);
cs.setString(2, "天龙八部");
cs.setString(3, "清华大学出版社");
//执行
cs.execute();
cs.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}2.案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
Sql代码
--有输入和输出的存储过程
create or replace procedure sp_pro8
(spno in number, spName out varchar2) is
begin
select ename into spName from emp where empno=spno;
end
--在java中调用
package com.oracle.demo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
public class Procedure_08_Test {
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl",
"scott", "0108");
CallableStatement cs = conn.prepareCall("{call sp_pro8(?,?)}");
//给第一个?赋值
cs.setInt(1, 7788);
//给第二个?赋值
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
//执行
cs.execute();
//取出返回值,要注意?的顺序
String name = cs.getString(2);
System.out.println(name);
cs.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}3.案例:有返回值的存储过程(列表[结果集])。编写一个过程,输入部门号,返回该部门所有雇员信息。
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,
但由于是集合,所以不能用一般的参数,必须要用pagkage了,步骤如下:
①建一个包。
②建立存储过程。
③下面看看如何在java程序中调用
1.建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:
Sql代码
create or replace package testpackage as
TYPE test_cursor is ref cursor;
end testpackage;
2.建立存储过程。如下:
Sql代码
create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor for
select * from emp where deptno = spNo;
end sp_pro9;
3.如何在java程序中调用该过程
package com.oracle.demo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class Procedure_09_Test {
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl",
"scott", "0108");
CallableStatement cs = ct.prepareCall("{call sp_pro9(?,?)}");
cs.setInt(1, 10);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
ResultSet set = (ResultSet) cs.getObject(2);
while (set.next()) {
System.out.println(set.getInt(1)+ " " + set.getString(2));
}
cs.close();
ct.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}4.编写分页过程
Sql代码
select t1.*, rownum rn from (select * from emp) t1 where rownum<=10;
select * from (select t1.*, rownum rn from (select * from emp) t1 where rownum<=10) where rn>=6;
--开发一个包
--建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:
Sql代码
create or replace package testpackage as
TYPE test_cursor is ref cursor;
end testpackage;
--开始编写分页的过程
create or replace procedure fenye
(tableName in varchar2,
pagesize in number,--一页显示记录数
pageNow in number,
myrows out number,--总记录数
myPageCo