Oracle中的存储过程,存储函数

1.存储过程

        存储过程实际上就是一些编译好的sql语句集,而存储函数与存储过程的区别就是函数可以进行return返回,另一个规则就是:如果查询只有一个返回值或者数据那么优先用存储函数

优点:       

1.将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用

2.批量处理:SQL+循环,减少流量,也就是“跑批”

3.统一接口,确保数据的安全

相对于oracle数据库来说,MySQL的存储过程相对功能较弱,使用较少


创建存储过程语法:

        create [or replace] procedure 过程名 (参数列表) is  PLSQL子程序体;

taps:       is也可以替换成as

以Oracle中的emp表为例:创建名称为TestOne的存储过程输入参数 为epno,输出参数为psal,phiredate.

create or replace procedure TestOne(epno in number,
                                                            psal out number,
                                                   phiredate out date) as
begin
  select sal,emp.hiredate
into psal,phiredate from emp where emp.empno=epno;

end ;

在sqldeveloper中调用

set serveoutput on

exec TestOne(7839);

在java代码中调用原始JDBC形式

    String sql ="{call TestOne(?,?,?)}";                           //调用存储过程语法{call <procedure-name>[(<arg1>,<arg2>, ...)]}
Connection con = this.getConnection();    //自己封装好的JDBC连接
CallableStatement call=null;                       //CallableStatement 用来操作存储过程的接口
call = con.prepareCall(sql);
//对in 参数进行赋值
call.setInt(1, 7839);
//对out参数进行申明  两种方式获取类型 OracleTypes  还有 java.sql.types
call.registerOutParameter(2, OracleTypes.INTEGER);
call.registerOutParameter(3,java.sql.Types.DATE);
call.execute();
int sal = call.getInt(2);
Date date = call.getDate(3);
System.out.println(sal+"|"+date);

2.存储函数

函数(Function)为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但)为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但必须有一个RETURN 子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型等。

创建存储函数语法:

        create [or replace] function 函数名 (参数列表) 

        return 函数值类型            

        is  PLSQL子程序体;

示例:输入一个员工编号,计算12个月的工资包括奖金,并返回

create or replace function queryEmp(peno in number)
return number
as
psal emp.sal%type;
pcomm emp.comm%type;
begin
  select sal,comm into psal,pcomm from emp where empno=peno;
  return psal*12+nvl(pcomm,0);
  end;

在java代码中调用原始JDBC形式:

String sql ="{?= call queryemp(?)}";          //调用函数语法 {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
Connection con = this.getConnection();
CallableStatement call=null;
call = con.prepareCall(sql);
//对第一个?进行申明
call.registerOutParameter(1, OracleTypes.INTEGER);
call.setInt(2, 7839);
call.execute();
//获取返回的申明
int sal = call.getInt(1);
System.out.println(sal);



猜你喜欢

转载自blog.csdn.net/qq_32711309/article/details/79595361