oracle--存储过程2--bk

oracle存储过程demo1---无返回值的存储过程:

/*
写一个过程,可以向book表添加书
*/

create table book(
id number(4),
book_name varchar2(30),
publishing varchar2(30)
)

create or replace procedure add_book
(
id in number,
name in varchar2,
publishing in varchar2
)is
begin
insert into book values(id,name,publishing);
commit;
end;

package com.etc.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
public class CunChuDemo1 {
public static void main(String[] args) {
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");//加载驱动
		Connection ct = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "orcl");//获取链接
		CallableStatement cs = ct.prepareCall("call add_book(?,?,?)");//创建CallableStatement
		//给?赋值
		cs.setInt(1, 1);
		cs.setString(2, "java");
		cs.setString(3, "java出版社");
		//执行
		cs.execute();
		//关闭
		cs.close();
	} catch (Exception e) {
		e.printStackTrace();
	}	
}
}
==============================================================
oracle存储过程demo2---有返回值的存储过程(非列表):

/*
编写一个存储过程,可以输入雇员的编号,返回该雇员的姓名。
*/

create or replace procedure sp_proc
(
spno in number,
spname out varchar2
)is
begin
select ename into spname from emp where empno=spno;
end;

package com.etc.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
public class CunChuDemo1 {
public static void main(String[] args) {
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver"); // 1.加载驱动
		Connection ct = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "orcl");// 2.得到连接
		CallableStatement cs = ct.prepareCall("call sp_proc(?,?)");// 3.创建CallableStatement
		cs.setInt(1, 7788); //给第一个?赋值
		cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//给第二个?赋值
		cs.execute();//4、执行
		//取出返回值,要注意?的顺序
		String name = cs.getString(2);
		System.out.println("编号7788的名字:" + name);
		cs.close();//5、关闭
	} catch (Exception e) {
		e.printStackTrace();
	}	
}
}
----------------------------------------------------------------
扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。

create or replace procedure sp_proc
(
spno in number,
spname out varchar2,
spsal out number,
spjob out varchar2
)is
begin
select ename,sal,job into spname,spsal,spjob from emp where empno=spno;
end;

package com.etc.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
public class CunChuDemo1 {
public static void main(String[] args) {
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");// 1.加载驱动
		Connection ct = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "orcl");// 2.得到连接
		CallableStatement cs = ct.prepareCall("call sp_proc(?,?,?,?)"); // 3.创建CallableStatement
		cs.setInt(1, 7788); //给第一个?赋值
		cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); //给第2个?赋值
		cs.registerOutParameter(3, oracle.jdbc.OracleTypes.DOUBLE); //给第3个?赋值
		cs.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR); //给第4个?赋值
		cs.execute(); //4、执行
		//取出返回值,要注意?的顺序
		String name = cs.getString(2);
		double sal = cs.getDouble(3);
		String job = cs.getString(4);
		System.out.println("编号7788的名字:" + name + ",职位" + job + ",薪水" + sal + "");
		cs.close(); //5、关闭
	} catch (Exception e) {
		e.printStackTrace();
	}	
}
}
====================================================================
oracle存储过程demo3---有返回值的存储过程(列表[结果集]):

/*
编写一个存储过程,输入部门号,返回该部门所有雇员信息。
*/
分析如下:由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,
但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分:
1)、建立一个包,在该包中我们定义类型test_cursor,它是个游标。

create or replace package testpackage
as
type test_cursor is ref cursor;
end testpackage;

2)、建立存储过程。
create or replace procedure sp_proc
(
spno in number,
p_cursor out testpackage.test_cursor
)is 
begin
open p_cursor for
select * from emp where deptno=spno;
end sp_proc;

package com.etc.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class CunChuDemo1 {
public static void main(String[] args) {
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver"); // 1.加载驱动
		 // 2.得到连接
		Connection ct = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "orcl");
		CallableStatement cs = ct.prepareCall("call sp_proc(?,?)"); // 3.创建CallableStatement
		cs.setInt(1, 10); //给第1个?赋值
		cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); //给第二个?赋值
		cs.execute();  //4、执行
		 //得到结果集
		ResultSet rs = (ResultSet) cs.getObject(2);
		while (rs.next()) {
			System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getInt(4) 
		+ " " + rs.getDate(5)+ " " + rs.getInt(6)+ " " + rs.getInt(7)+ " " + rs.getInt(8));
		}
		  //5、关闭
		rs.close();
		cs.close();
		ct.close();
	} catch (Exception e) {
		e.printStackTrace();
	}	
}
}
===========================================================================

  

原文地址:https://www.cnblogs.com/ipetergo/p/6323664.html