PLSQL编程_存储过程and存储函数

存储过程

存储过程相当于是对代码的封装,可提高代码的复用性,已经代码执行效率,

语法 :

create [or replace] procedure 存储过程名称(参数1,参数2,....) 
is

begin

end;

demo

使用执行过程输出一句话,

--创建执行过程
create or replace procedure procedure_name(str varchar2)
is

begin
  dbms_output.put_line(str);
end;



--使用执行过程 方式一 :
call procedure_name('学习使我快乐');

--使用执行过程 方式二:
declare 

begin
  procedure_name('学习使我快乐');
end;

输出结果如下:
这里写图片描述

说白了,其实存储过程就相当于是函数,方法,概念都是一样的,

封装存储过程:给指定员工涨薪,并打印涨薪前和涨薪后的工资

Demo

create or replace procedure procedure_name(u_empno in number,addMoney in number)
is
u_sal number;

begin
  select sal into u_sal from emp where empno=u_empno;

  dbms_output.put_line('加薪前的工资:'||u_sal);

  update emp set sal=u_sal+addMoney where empno=u_empno;
  dbms_output.put_line('加薪后的工资:'||(u_sal+addMoney));

  --提交事务
  commit;
end;

//调用存储过程

call procedure_name(7369,100);


输出结果如下

这里写图片描述

封装一个存储过程: 获取指定员工的年薪

需要一个员工编号,返回一个年薪


create or replace procedure proc_getyearsal(vempno in number,vyearsal out number)
is

begin
  select sal*12+nvl(comm,0) into vyearsal from emp where empno=vempno;
end;


--使用存储过程

declare 
yearSal number;
begin
  procedure_name(7369,yearSal);

  --输出结果 
  dbms_output.put_line(yearSal);
end;

输出结果如下
这里写图片描述


存储函数

存储函数可以提高代码的复用性
增加代码执行效率,
语法

create or replace function function_name(参数1,参数2,...) return 返回值类型
is

begin

end;

存储函数 跟 存储过程的区别
1. 存储过程是给jdbc调用的,存储函数是给存储过程和sql语句调用的,
2. 存储过程没有返回值,但是可以返回数据,(通过out 类型的参数)
3. 存储过程不能在sql里调用,但是存储函数可以

存储函数 跟 存储过程达到的功能基本一致,,区别很小很小,

封装获取指定编号员工的年薪的存储函数
create or replace function function_name(v_empno in number) return number
is
vyearSal number;
begin
  select sal * 12 + nvl(comm,0) into vyearSal from emp where empno =  v_empno ;
  return vyearSal;
end;


在sql语句里使用存储函数 
select function_name(7369) from dual;

运行结果如下
这里写图片描述

在 plsql里使用存储函数的方式如下

declare

begin
  dbms_output.put_line(function_name(7369));
end;

运行结果如下
这里写图片描述

在java代码里使用存储过程获取数据

首先,创建一个存储过程 

create or replace procedure procedure_name(vmeps out sys_refcursor) 
is

begin
  --开启游标 
  open vmeps for select * from emp;
end;

游标就相当是jdbc 的resultset,我们需要使用游标来获取数据 

注意,需要导入oracle的jar包,还有jdbc提供的
 @Test
    public void test_01() throws Exception {
        //注册驱动
        Class.forName("oracle.jdbc.OracleDriver");

        //获取连接,写法基本一致,就数据库ip不同,
        String url = "jdbc:oracle:thin:@192.168.129.100:1521:orcl";
        String username= "scott";
        String password = "tiger";
        Connection conn = DriverManager.getConnection(url, username, password);

        //获取oracle的执行对象  {call <procedure-name>[(<arg1>,<arg2>, ...)]} 格式 
        String sql = "call procedure_name(?)";//游标类型用 ? 号代替 
        CallableStatement call = conn.prepareCall(sql);

        call.registerOutParameter(1, OracleTypes.CURSOR);
        System.out.println(call.getClass().getName());  //输出查看类型,

        conn.close();
    }
因为我们不知道CallableStatement 的真实类型,所以我们先输出打印看看   

这里写图片描述

我们可以通过输出发现 ,call 其实是这个T4CCallableStatement类型,我们强转成T4CCallableStatement类型 ,但是会报错

这里写图片描述

我们进入T4CCallableStatement这个类看看,

这里写图片描述
观察T4CCallableStatement类我们发现,这个类没有修饰符, 一个类如果没有修饰符,那么默认就是 protect 受保护的,使用范围在当前包下,所以我们放弃转换对象成
T4CCallableStatement, 我们把目标转换成它的父类

然后我们调用getCursor的方法,拿到resultSet,然后我们就可以获取里面的值啦,
这里写图片描述

以上就是plsql中的存储函数,存储过程,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值