java 调用Oracle存储过程(输入参数,输出参数,游标)的使用!

原创 2016年08月30日 21:17:55

一、存储过程

--(1)添加数据
create or replace procedure proc_add(mname varchar2,mpwd varchar2,mmoney number,errid out number)
is
  v_count number;
begin
select count(1) into v_count from master where name=mname;
 if v_count>0 then
    errid:=1;
 else
    errid:=0;
    insert into master values(seq_pid.nextval,mname,mpwd,mmoney);
 end if;
end;


--调用
 declare
  errid number;
  begin
     proc_add('back','aaa',1200,errid);
     dbms_output.put_line(errid);
     if errid=1 then
       dbms_output.put_line('已存在!');
     else
       dbms_output.put_line('可以添加!');
     end if;
  end;


  --(2)登录
  select count(1) from master where name='mike' and pwd='aaa1'
  
create or replace procedure proc_login(mname varchar2,mpwd varchar2,msg out varchar2)
is
  v_count number;
begin
select count(1) into v_count from master where name=mname and pwd=mpwd;
 if v_count>0 then
    msg:='登录成功!';
 else
    msg:='登录失败!';
 end if;
end;


--调用
 declare
  errid varchar2(20);
  begin
     proc_login('back','aaa1',errid);
     dbms_output.put_line(errid);
     if errid='登录成功!' then
       dbms_output.put_line('OK');
     else
       dbms_output.put_line('NO');
     end if;
  end;


  --(3)查询所有的数据
create or replace procedure proc_all(v_name varchar2,refMaster out sys_refcursor)
is
begin
    if (v_name is null) then  --是否为空
       open refMaster for select * from master order by id ;
    else    --不为空!
        open refMaster for select * from master where name like v_name order by id ;
     end if;
end; 

 --cmd命令窗口
  C:\>sqlplus "sqb/aaa@ORCL"
  var c1 refcursor  --声明游标
  execute proc_all(null,:c1);  --执行存储过程
  print c1;   --显示结果


--调用
declare 
  c1 sys_refcursor; --引用游标
  type master_table is table of master%rowtype;  --表格
   mytable master_table;  --表格变量
begin
   --proc_all('%a%',c1);  --调用存储过程
    proc_all('',c1);  --调用存储过程
   fetch c1 bulk collect into mytable;
  for i in 1..mytable.count loop
    dbms_output.put_line(mytable(i).id||'--'||mytable(i).name);
  end loop;
end;


二、Java调用Oracle存储过程

private static void getAdd(String name, String pwd, double money) {
		BaseDao dao = new BaseDao();
		// 1.
		Connection conn = dao.getConnection();

		String sql = "{ call proc_add(?,?,?,?)}";

		// 2.
		try {
			CallableStatement cs = conn.prepareCall(sql);

			// set value
			cs.setString(1, name);
			cs.setString(2, pwd);
			cs.setDouble(3, money);
			// register out
			cs.registerOutParameter(4, Types.INTEGER);
			// execute sql
			cs.execute();
			// get value
			int count = cs.getInt(4);

			if (count > 0) {
				System.out.println("已存在数据!");
			} else {
				System.out.println("添加成功!");
			}

			// close
			cs.close();
			conn.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

private static String isLogin(String name, String pwd) {
		BaseDao dao = new BaseDao();
		// 1.
		Connection conn = dao.getConnection();

		String sql = "{ call proc_login(?,?,?)}";

		// 2.
		try {
			CallableStatement cs = conn.prepareCall(sql);

			// set value
			cs.setString(1, name);
			cs.setString(2, pwd);

			// register out
			cs.registerOutParameter(3, Types.VARCHAR);

			// execute sql
			cs.execute();

			// close
			// cs.close();
			// conn.close();

			// get value
			return cs.getString(3);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;
	}

private static void list() {
		BaseDao dao = new BaseDao();
		// 1.
		Connection conn = dao.getConnection();

		String sql = "{ call proc_all(?,?)}";

		// 2.
		try {
			CallableStatement cs = conn.prepareCall(sql);

			cs.setString(1, "%a%");
//			cs.setString(1, "");
			// register out cursor
			cs.registerOutParameter(2, OracleTypes.CURSOR);

			// execute sql
			cs.execute();

			ResultSet rs = (ResultSet) cs.getObject(2);
			while (rs.next()) {
				System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t"
						+ rs.getString(3));
			}

			// close
			cs.close();
			conn.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

总结:

    Java中可以灵活,方便的调用存储过程!

版权声明:本文为博主原创文章,未经博主允许不得转载。

oracle存储过程(游标作为OUT参数输出)

包中带过程      要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 procedure AAA(变量名 out [cur_name])如此申明O...
  • ytlizhen1
  • ytlizhen1
  • 2013年02月26日 21:08
  • 2815

java调用oracle中输入参数是数组类型的函数或者存储过程

这次遇到一个开发需求,提供一个接口,输入参数是数组类型,要通过oracle封装的函数进行调用,返回结果也是一个数组。 记录一下对这种类型的实现方法,备忘。实际名称中用xxx替换了部分值,参考用 o...
  • wenjinghai
  • wenjinghai
  • 2016年07月28日 16:14
  • 406

java调用输入参数、输出参数、输出参数为列表的存储过程(一)

package com.proctest; import java.sql.*; import java.sql.ResultSet;   public class...
  • Z_Y_J_1_2_3
  • Z_Y_J_1_2_3
  • 2014年04月14日 08:46
  • 1587

存储过程中输出参数为游标的时候怎么处理

http://msdn.microsoft.com/zh-cn/library/ms175498(v=sql.90).aspx Transact-SQL 存储过程只能将 cursor...
  • zjlolife
  • zjlolife
  • 2013年07月01日 17:29
  • 1480

oracle存储过程中游标的使用(包括带参数的游标)

最近因为项目需要要写存储过程,以前没咋写过,接触到是接触过,在软通的时候接触过,那是华为的项目那个几个存储过程很大很复杂,也很乱,注释也少,看了个大概。最近一个月,前后也写了七八个简单点的存储过程,也...
  • wangwuyilove
  • wangwuyilove
  • 2015年06月24日 17:33
  • 10519

Oracle自定义函数及应用举例(不同输入输出参数情况)

Oracle自定义函数及应用举例(不同输入输出参数情况)
  • u013882957
  • u013882957
  • 2017年04月30日 15:00
  • 902

mybatis 调用存储过程 返回游标 实例

[sql] view plaincopy 存储过程示例:   create or replace procedure Fsp_Plan_CheckPrj(v_grantno  varchar2,...
  • e_wsq
  • e_wsq
  • 2015年12月31日 09:02
  • 1057

oracle_动态sql与参数游标

CREATE OR REPLACE PROCEDURE p_test_dynamicsql_cursor(as_parameter VARCHAR2) AS --声明带参数的游标 CURSOR c...
  • sgs595595
  • sgs595595
  • 2016年07月18日 15:53
  • 491

oracle中游标详细用法

游标的概念:      游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处...
  • yang_ai
  • yang_ai
  • 2016年12月10日 21:07
  • 908

mybatis调用存储过程的例子,含输入输出参数

接上篇文章:mybatis3.2.7事务查询和插入例子 继续增加新的类
  • rishengcsdn
  • rishengcsdn
  • 2014年09月12日 14:15
  • 13221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 调用Oracle存储过程(输入参数,输出参数,游标)的使用!
举报原因:
原因补充:

(最多只允许输入30个字)