1.无返回值的存储过程
创建书籍表 create table book(bookId number,bookName varchar2(50),publishHouse varchar2(50));
创建存储过程
--in 表示是输入值,out表示是输出值
create or replace procedure sp_pro7(spBookId in number,spBookName in varchar2,spPublishHouse in varchar2) is
begin
insert into book values(spBookId,spBookName,spPublishHouse);
end;
在JAVA中调用
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc,oracle.thin:@127.0.0.1:1521:ORCL","scott","tiger");
//创建CallableStatement
CallableStatement cs=conn.prepareCall("{call sp_pro7(?,?,?)}");
cs.setInt(1,10);
cs.setString(2,"高等数学");
cs.setString(3,"机械工业出版社");
//执行
cs.execute();
//关闭打开的资源
cs.close();
conn.close();
有输入和输出的存储过程(返回单个值),通过编号查出姓名
create or replace procedure sp_pro8(spno in number,spName out varchar2) is
begin
select ename into spName from emp where empno=spno;
end;
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc.oracle.thin:@127.0.0.1:1521:ORCL","scott","tiger");
CallableStatement cs=conn.prepareCall("{call sp_pro8(?,?)}");
//给第一个问号赋值
cs.setInt(1,7788);
//给第二个问号赋值,相当于注册一个输出值,同时给予类型
cs.registerOutParameter(2,oracle.jdbc.OracleType.VARCHAR);
//执行
cs.execute();
//取出返回值,要注意问号的顺序
String name=cs.getString(2);
//关闭资源
如果返回多个值,直接加问号,原理与上面一致。
有返回值的存储过程(列表【结果集】)
编写一个存储过程,输入部门号,返回所有的雇员的信息
由于oracle存储过程没有返回值,它的所有返回值都是由out参数来代替的,列表同样也不例外。由于是结果集,不能用一般的参数,必须用package了.
所以分为两部分
1.创建一个包,在该包中定义了一个游标类型的游标test_cursor;
create or replace package testpackage as
type test_cursor is ref cursor;
end package;
2.创建存储过程
create or replace procedure sp_pro9(spNo in number,spName out varchar2, p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp where deptno=spNo;
end;
在Java中的调用
create or replace
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc.oracle.thin:@127.0.0.1:1521:ORCL","scott","tiger");
CalableStatement cs=conn.prepareCall(“{call sp_pro9(?,?)}”);
cs.setInt(1,10);
cs.registerOutParameter(2,oracle.jdbc.OracleType.VARCHAR);
cs.registerOutParameter(2,oracle.jdbc.OracleType.CURSOR);
cs.execute();
//取出结果集
ResultSet rs=(ResultSet)cs.getObject(2);
while(rs.next){
System.out.oprintln(rs.getInt(1));
}