数据库存储过程及存储函数

存储过程

在java中经常用封装的思想来提高代码的重用性,在java中为什么要定义方法?原因是有一个功能是需要在不同的地方多次使用的,如果在每一个需要调用的地方都写一遍会造成代码量很大,所以我们把他抽取成单独的方法,在需要使用的时候调用这个方法。同样的道理,如果同一个数据库操作需要被多次使用,这个时候可以考虑将他抽取出来,这样被抽取出来的这个类似与方法的东西就是存储过程。所以,简单的说,存储过程实际就是封装在服务器上的一段PL/SQL代码片段,已经编译好了的代码片段。可见,由于已经编译好了,所以,客户端调用存储过程的执行效率比直接执行sql语句的效率会快。

语法结构:
    create [or replace] procedure  存储过程的名称(参数名 in|out 参数类型)
    is |  as
        --声明部分
    begin
        --业务逻辑
    end;

实例:给指定员工涨工资,并且打印涨薪前和涨薪后的工资。

create or replace procedure  pro_test1(vempno in number,vnum in number)
        is
            --声明变量
            vsal number;
        begin

            --业务逻辑
            --查询当前的工资
            select sal into vsal  from emp where empno=vempno;
                dbms_output.put_line('涨薪前'||vsal);
            --更新工资
            update emp set sal=vsal+vnum where empno=vempno;
                dbms_output.put_line('涨薪后'||(vsal+vnum));
            --提交,更新操作,提交的是事务
            commit;
        end;    

调用上面的存储过程:

call pro_test1(给定一个员工编号,涨工资钱数);

存储函数

存储函数的其实和存储过程差不多。

语法:

create[or replace] function 存储函数的名字(参数名 in|out 参数类型...) return 参数类型

 is|as
 begin
 end;

实例:查询指定员工的年薪sal*12+nvl(comm,0)

create or replace function fun_test1(vempno number ) return number
            is
                --声明变量
                vtotalsal number;
            begin
                select sal*12+nvl(comm,0) into vtotalsal from emp where empno=vempno;
                return vtotalsal;
 end;

调用存储函数:

declare
                vsal number;
            begin
                vsal :=fun_test1(7369);
                dbms_output.put_line(vsal);
end;


JDBC调用存储过程:

        //1、导入驱动包
        //2、注册驱动
        Class.forName("oracle.jdbc.OracleDriver");

        //3、获取连接
        Connection conn = DriverManager.getConnection
                ("jdbc:oracle:thin:@localhost:1521:ORCL", "wsh", "wsh");
 
        //4、获取执行sql的statement对象,封装参数,执行sql
        String sql="{call proc_gettotalsal(?,?)}";
        CallableStatement statement = conn.prepareCall(sql);

        //设置输入参数
        statement.setInt(1, 7788);

        //注册输出参数
        statement.registerOutParameter(2, OracleTypes.NUMBER);

        //执行statement对象
        statement.execute();

        //5、获取结果,输出参数是几,获取的就是几
        int totalsal = statement.getInt(2);

        //输出结果:工资前和工资后
        System.out.println("工资"+totalsal);
        //6、释放资源
        statement.close();
        conn.close();



JDBC调用存储函数:

            //1、导入驱动包
			//2、注册驱动
				Class.forName("oracle.jdbc.OracleDriver");

			//3、获取连接
				Connection conn = DriverManager.getConnection
						("jdbc:oracle:thin:@localhost:1521:ORCL", 
								"wsh", "wsh");

			//4、获取执行sql的statement对象,封装参数,执行sql
				String sql="{?= call func_getsal(?)}";
				CallableStatement statement = conn.prepareCall(sql);

			//5、获取结果
				//设置输出参数
				statement.registerOutParameter(1, OracleTypes.NUMBER);
				//设置输入参数
				statement.setInt(2, 7788);
				//执行sql
				statement.execute();
				int totalsal = statement.getInt(1);
				System.out.println("年薪工资:"+totalsal);

			//6、关闭资源
				statement.close();
				conn.close();

猜你喜欢

转载自blog.csdn.net/diaobaaiqiqi/article/details/82696617