存储过程的 概念:
存储过程:就是一块PLSQL语句包装起来,起个名称
语法上:相当于plsql语句戴个帽子。
相对而言:单纯plsql可以认为是匿名程序。
存储作用:
1,在开发程序中,为了一个特定的业务功能,会向数据库进行多次连接关闭(连接和关闭是很耗费资源)。这种就需要对数据库进行多次I/O读写,性能比较低。如果把这些业务放到PLSQL中,在应用程序中只需要调用PLSQL就可以做到连接关闭一次数据库就可以实现我们的业务,可以大大提高效率.
2, ORACLE官方给的建议:能够让数据库操作的不要放在程序中。在数据库中实现基本上不会出现错误,在程序中操作可以会存在错误.(如果在数据库中操作数据,可以有一定的日志恢复等功能.)
提示:
l plsql是存储过程的基础。
l java是不能直接调用plsql的,但可以通过存储过程这些对象来调用。
存储过程的语法:
create or replace PROCEDURE 过程名(参数名) AS/IS plsql子程序体
根据参数的类型,我们将其分为3类讲解:
l不带参数的
l带输入参数的
l带输入输出参数的。
<1>无参存储:
创建存储:建议使用PROCEDURE这个窗口
create or replace procedure p_hello IS
begin
dbms_output.put('b'); --写入buffer但不输出
dbms_output.new_line; --回车(换行),输出
dbms_output.put_line('hello world!'); --输出并换行
end p_hello
测试存储:
调用方法:
如何调用执行,两种方法:
l一种是是用exec命令来调用—用来测试存储
exec过程名
l一种是用其他的程序(plsql和java)来调用
l 程序调用
BEGIN
sayhelloworld;
sayhelloworld;
sayhelloworld;
END;
带书输入参数IN
示例
查询并打印某个员工(如7839号员工)的姓名和薪水--存储过程:要求,调用的时候传入员工编号,自动控制台打印:
create or replace procedure p_queryempsal(i_empno IN emp.empno%TYPE)
IS
--声明变量
v_ename emp.empname%TYPE;
v_sal emp.empsal%TYPE;
select empname,empsal into v_ename,v_sal from emp where empno=i_empno;
dbms_output.put_line('姓名:'||v_ename||',薪水:'||v_sal);
end p_queryempsal;
--命令调用
exec p_queryempsal(7878);
--程序调用
declare
i_empno emp.empno%TYPE:=8989;
BEGIN
p_queryempsal(i_empno );
END;
带输入参数IN和输出结果OUT-----主要是其他程序调用
示例:
----输入员工号查询某个员工(7839号(老大)员工)信息,要求,将薪水作为返回值输出,给调用的程序使用。
CREATE OR REPLACE PROCEDURE p_queryempsal_out( i_empno IN emp.empno%TYPE,o_sal OUT emp.sal%TYPE)
AS
BEGIN
--赋值:将薪水的值赋给输出的参数o_sal
SELECT sal INTO o_sal FROM emp WHERE empno=i_empno;
END;
调用:
DECLARE
--输入参数值
v_empno emp.empno%TYPE:=7839;
--声明一个变量来接收输出参数
v_sal emp.sal%TYPE;
BEGIN
p_queryempsal_out(v_empno,v_sal);--第二个参数是输出的参数,必须有变量来接收!!
--当上面的语句执行之后,v_sal就有值了。
dbms_output.put_line('员工编号为:'||v_empno||'的薪资为:'||v_sal);
END;
java程序如何调用存储过程:
//获取连接
Connection conn = JDBCUtils.getConnection();
String sql="{call p_queryempsal_out(?,?)}";//转义sql
CallableStatement call = conn.prepareCall(sql);
//1.输入参数
call.setInt(1, 7839);//索引位置
call.registerOutParameter(2, OracleTypes.DOUBLE);//第一个参数是占位符,第二个参数数据类型
//执行存储
call.execute();//执行的时候,会自动将参数传入数据库,将输出参数返回的数据,封装会call对象中。
//获取输出参数的值
doublesal = call.getDouble(2);
System.out.println("薪资是:"+sal);
//释放资源
JDBCUtils.release(conn, call, null);
结果如下: