java语言利用存储过程和存储函数操作oracle数据库。
一、存储过程的书写
1.首先打开PL/SQL Developer 文件 –>新建—>SQL窗口
开始书写存储过程语句。例子如下
create or replace procedure testJava(name IN VARCHAR ,count OUT NUMBER)
IS
begin
SELECT QUANTITY into count FROM JAVATEST WHERE NAMES=name;
end testJava;
然后执行F8进行编译如果没有报错则说明执行成功。
书写java代码
这是一个获取Connection的工具类,大家可以随时调用
package com.test.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private static String driver="oracle.jdbc.OracleDriver";
private static String url="jdbc:oracle:thin:@db.xxx.com:8089/数据库名称";
private static String user="用户名";
private static String password="密码";
static {
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection(){
/**
* 1、性能优化
* 2、故障诊断:死锁(ThreadDump
* Oracle:自动处理)
*/
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void release(Connection con,Statement st,ResultSet set){
if(set!=null){
try {
set.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
set=null;
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
st=null;///---java的垃圾回收
}
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
con=null;
}
}
}
}
}
测试函数
@Test
public void TestProduce(){
//{(call <procedure-name>[(<arg1>,<arg2>,<arg3>)])}
//下边这句是sql语句 call开头 存储过程的别名作为方法名参数列表对应 in为输入参数,out为输出参数
String sql="{call testJava(?,?)}";
Connection con=null;
CallableStatement call=null;
con=JDBCUtils.getConnection();
try {
call=con.prepareCall(sql);
//对于in参数的输入类型 一般先进行赋值
call.setString(1, "dddd");//将第一个参数设置为dddd
//对于out参数,申明他是输出参数
call.registerOutParameter(2,OracleTypes.NUMBER);
//call.registerOutParameter(3, OracleTypes.NUMBER);
//执行
call.execute();
//输出c
int quantity = call.getInt(2);
System.out.println(quantity+"");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
JDBCUtils.release(con, call, null);
}
JDBCUtils.release(con, call, null);
}
存储函数的书写
1、
1.首先打开PL/SQL Developer 文件 –>新建—>SQL窗口
开始书写存储过程语句。例子如下
create or replace function queryQuantity(name in varchar)
return number
is
--定义要要查询的人员的数量
mquantity JAVATEST.QUANTITY%TYPE;
begin
--获取数量
select QUANTITY INTO mquantity from JAVATEST WHERE NAMES=name;
--返回查询数据
return mquantity;
end queryQuantity;
书写java代码
@Test
public void testFunction(){
//(?=call <procedure-name>[(<arg1>,<arg2>,<arg3>)])
//由于是存储函数,所以在call关键字之前要有参数?来接收数据。
String sql="{?=call queryQuantity(?)}";
//对于输入参数,一般都是进行赋值,
//对于输出参数out (该例子没有输出参数)
Connection con=null;
CallableStatement call=null;
con=JDBCUtils.getConnection();
try {
call=con.prepareCall(sql);
//参数1就是sql语句中的?的位置,另外registerOutParameter参数就是为了声明接收参数
call.registerOutParameter(1, OracleTypes.VARCHAR);
call.setString(2, "pingdingshanxueyuan");
//执行
call.execute();
//取出输出的数据,参数为sql语句的?的位置相当于接收数据
int i = call.getInt(1);
System.out.println(i+"");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}