Orcale 存储过程和存储函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/theOne1207/article/details/79578116
存储过程,存储函数

数据库对象

    存储在数据库中供所有用户调用的子程序叫做存储过程,存储函数

--存储过程 打印helloworld
/*
       调用存储过程的方式
       1.exec pro_say_helloworld();
       2begin
              pro_say_helloworld();
       end;
*/
create procedure pro_say_helloworld
as
--说明部分
begin
  dbms_output.put_line('helloworld!');
end;

--调用存储过程
begin
     pro_say_helloworld();
     pro_say_helloworld();
end;

--创建一个带参数的存储过程
--给指定员工涨100元工资,并且打印涨钱和涨后的薪水

drop procedure pro_RaiseSalry;

create or replace procedure pro_RaiseSalary(eno in number)
as 
       psal   emp.sal%type;--定义一个变量保存涨薪水之前的工资
begin
       select sal into psal from emp where id=eno;
       update emp set sal = sal +100 where id=eno;
       DBMS_OUTPUT.PUT_LINE('涨工资前的薪水'||psal||'涨工资后的薪水'||(psal+100));
end;

--注意 !! 一般不在存储过程或者存储函数中提交事务和回滚

begin
  pro_RaiseSalary(1);
  commit;
end;
--in和out参数
--一般来讲存储和存储函数的区别在于存储函数可以有返回值;而存储过程没有返回值
--存储过程和存储函数都可以用out指定一个或者多个出处参数利用
--存储过程和存储函数实现返回多个值

--原则:返回一个值用存储函数;否则用存储过程。

--out:查询某个员工 月薪和职位
create procedure pro_queryEmp(eno in number,pename out varchar2,psal out number)
as     
begin
  select empname,sal into pename,psal from emp where id = eno;
end;

应用程序调用存储过程

public static void main(String[] args) {
		String sql = "{call pro_queryemp(?,?,?)}";
		Connection conn = DBUtil.getConn();
		//得到链接
		CallableStatement call = null;
		try {
			call = conn.prepareCall(sql);
			call.setInt(1, 1);
			//输入参数需要赋值
			call.registerOutParameter(2, OracleTypes.VARCHAR);
			call.registerOutParameter(3, OracleTypes.NUMBER);
			//out输出
			call.execute();
			String name = call.getString(2);
			double sal = call.getDouble(3);
			System.out.println(name+"      "+sal);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBUtil.close(conn, call, null);
		}
	}

存储函数

--存储函数(function)
/*
  函数function 可以带参数,可以参数,并返回返回值
  函数和过程的结构类似,但必须有一个return子句,用于返回函数值
*/
--语法
create function 函数名(参数)
return 函数值类型
as
begin
  
end;

--存储函数:查询某个员工的年收入 (有的字段是空字段比如罚款或者奖金就要
-- 预空,就是空字段设置值用 nvl(字段名,0))
create or replace function fun_queryempincome(eno number)
return number
as
       psal emp.sal%type;   --定义函数保存某员工收入
begin
  select sal into psal from emp where id = eno;
  return psal*12;
end;

--使用存储函数 要用变量接收 
declare
  psal   emp.sal%type;
begin
   psal:= fun_queryempincome(1);
   dbms_output.put_line('薪水是'||psal);
end;

应用程序调用

public static void main(String[] args) {
		String sql = "{? =call fun_queryempincome(?)}";
		Connection conn = DBUtil.getConn();
		//得到链接
		CallableStatement call = null;
		try {
			call = conn.prepareCall(sql);
			call.registerOutParameter(1, OracleTypes.NUMBER);
			//out输出 使用orcaletypes常量
			call.setInt(2, 1);
			//传递参数
			call.execute();
			double sal = call.getDouble(1);
			System.out.println("年收入:  "+sal);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBUtil.close(conn, call, null);
		}
	} 

来自csdn和慕课老师的总结的个人学习

展开阅读全文

没有更多推荐了,返回首页