浅析Java JDBC调用Oracle存储过程

开发 后端
本文将简单介绍Java JDBC调用Oracle存储过程,其中将说到三中不同调用存储过程,希望本文能对大家有所帮助。

Java JDBC调用Oracle存储过程一般有3种:

1.无返回值

2.有一个返回值

3.返回一个数据集,就是游标!

关键字:call 语法格式{call 存储过程名(参数列表)}

废话不说,见代码!

Java JDBC调用Oracle存储过程业务实例:

1.添加员工,如果指定部门不存在,则先添加部门信息,再添加员工(无返回值)

--创建存储过程如下  

  1. CREATE OR REPLACE PROCEDURE sp_add_emp1(      
  2.     v_empno emp.empno%TYPE,      
  3.     v_ename emp.ename%TYPE,      
  4.     v_deptno dept.deptno%TYPE,      
  5.     v_dname dept.dname%TYPE      
  6. )AS     
  7.     num1 NUMBER;      
  8.     num2 NUMBER;      
  9. BEGIN     
  10.    SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;      
  11. IF(num1=0) THEN     
  12.    INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);      
  13. END IF;      
  14.    SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;      
  15. IF(num2=0)THEN     
  16.    INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);      
  17. ELSE     
  18.     raise_application_error(-202021,'员工id 重复!!!');      
  19. END IF;      
  20.    commit;      
  21.      
  22. END;     
  23.  
  24. CREATE OR REPLACE PROCEDURE sp_add_emp1(  
  25.    v_empno emp.empno%TYPE,  
  26.    v_ename emp.ename%TYPE,  
  27.    v_deptno dept.deptno%TYPE,  
  28.    v_dname dept.dname%TYPE  
  29. )AS 
  30.    num1 NUMBER;  
  31.    num2 NUMBER;  
  32. BEGIN 
  33.    SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;  
  34. IF(num1=0) THEN 
  35.    INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);  
  36. END IF;  
  37.    SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;  
  38. IF(num2=0)THEN 
  39.    INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);  
  40. ELSE 
  41.    raise_application_error(-202021,'员工id 重复!!!');  
  42. END IF;  
  43.    commit;  
  44.  
  45. END

Java中调用代码1:

  1. Class.forName("oracle.jdbc.driver.OracleDriver");      
  2. conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");      
  3. conn.setAutoCommit(false);      
  4.      
  5. conn=DBConnection.getDBConnection().getConnection();      
  6. String spName="{call sp_add_emp1(?,?,?,?)}";      
  7. CallableStatement cstmt=conn.prepareCall(spName);      
  8. cstmt.setInt(1, 2);      
  9. cstmt.setString(2, "wwww");      
  10. cstmt.setInt(3, 1);      
  11. cstmt.setString(4, "qwqwq");      
  12. cstmt.executeUpdate();      
  13.      
  14. conn.close();     
  15.  
  16.   Class.forName("oracle.jdbc.driver.OracleDriver");  
  17.   conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");  
  18.   conn.setAutoCommit(false);  
  19.  
  20.   conn=DBConnection.getDBConnection().getConnection();  
  21.   String spName="{call sp_add_emp1(?,?,?,?)}";  
  22.   CallableStatement cstmt=conn.prepareCall(spName);  
  23.   cstmt.setInt(1, 2);  
  24.   cstmt.setString(2, "wwww");  
  25.   cstmt.setInt(3, 1);  
  26.   cstmt.setString(4, "qwqwq");  
  27.   cstmt.executeUpdate();  
  28.  
  29.   conn.close(); 

2.需求同上, 只是返回该部门的员工总数。(有一个返回值)

--创建存储过程如下  

  1. CREATE OR REPLACE PROCEDURE sp_add_emp2(      
  2.     v_empno emp.empno%TYPE,      
  3.     v_ename emp.ename%TYPE,      
  4.     v_deptno dept.deptno%TYPE,      
  5.     v_dname dept.dname%TYPE,      
  6.      
  7.     num out number      
  8. )AS     
  9.     num1 NUMBER;      
  10.     num2 NUMBER;      
  11. BEGIN     
  12.    SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;      
  13. IF(num1=0) THEN     
  14.    INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);      
  15. END IF;      
  16.    SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;      
  17. IF(num2=0)THEN     
  18.    INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);      
  19. ELSE     
  20.     raise_application_error(-202021,'员工id 重复!!!');      
  21. END IF;      
  22.      
  23.     num:=num1;      
  24.    commit;      
  25.      
  26. END;     
  27.  
  28. CREATE OR REPLACE PROCEDURE sp_add_emp2(  
  29.    v_empno emp.empno%TYPE,  
  30.    v_ename emp.ename%TYPE,  
  31.    v_deptno dept.deptno%TYPE,  
  32.    v_dname dept.dname%TYPE,  
  33.  
  34.    num out number  
  35. )AS 
  36.    num1 NUMBER;  
  37.    num2 NUMBER;  
  38. BEGIN 
  39.    SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;  
  40. IF(num1=0) THEN 
  41.    INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);  
  42. END IF;  
  43.    SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;  
  44. IF(num2=0)THEN 
  45.    INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);  
  46. ELSE 
  47.    raise_application_error(-202021,'员工id 重复!!!');  
  48. END IF;  
  49.  
  50.    num:=num1;  
  51.    commit;  
  52.  
  53. END

Java中调用代码2:

  1. Class.forName("oracle.jdbc.driver.OracleDriver");      
  2. conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");      
  3. conn.setAutoCommit(false);      
  4.      
  5. conn=DBConnection.getDBConnection().getConnection();      
  6.      
  7. String spName="{call sp_add_emp2(?,?,?,?,?)}";      
  8. CallableStatement cstmt=conn.prepareCall(spName);      
  9. cstmt.setInt(1,1111);      
  10. cstmt.setString(2, "qqqq");      
  11. cstmt.setInt(3, 50);      
  12. cstmt.setString(4, "pppp");      
  13. cstmt.registerOutParameter(5, java.sql.Types.INTEGER);      
  14. cstmt.executeUpdate();      
  15. int i = cstmt.getInt(5);      
  16. System.out.println(i);      
  17. cstmt.close();      
  18. conn.close();     
  19.  
  20.      Class.forName("oracle.jdbc.driver.OracleDriver");  
  21.      conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");  
  22.      conn.setAutoCommit(false);  
  23.  
  24.      conn=DBConnection.getDBConnection().getConnection();  
  25.  
  26.      String spName="{call sp_add_emp2(?,?,?,?,?)}";  
  27.      CallableStatement cstmt=conn.prepareCall(spName);  
  28.      cstmt.setInt(1,1111);  
  29.      cstmt.setString(2, "qqqq");  
  30.      cstmt.setInt(3, 50);  
  31.      cstmt.setString(4, "pppp");  
  32.      cstmt.registerOutParameter(5, java.sql.Types.INTEGER);  
  33.      cstmt.executeUpdate();  
  34.      int i = cstmt.getInt(5);  
  35.      System.out.println(i);  
  36.      cstmt.close();  
  37.      conn.close(); 

3.需求同上, 并返回该部门的员工信息(工号和姓名)。(返回一个游标)

--创建存储过程如下

Sql代码

--1.建包    

  1. CREATE OR REPLACE PACKAGE my_pak AS     
  2.    TYPE my_cus IS REF CURSOR   ;      
  3. END my_pak;     

--2.写存储返回过程    
   

  1. CREATE OR REPLACE PROCEDURE sp_add_emp3(      
  2.     v_empno emp.empno%TYPE,      
  3.     v_ename emp.ename%TYPE,      
  4.     v_deptno dept.deptno%TYPE,      
  5.     v_dname dept.dname%TYPE,      
  6.      
  7.     p_cus OUT my_pak.my_cus      
  8. )AS     
  9.     num1 NUMBER;      
  10.     num2 NUMBER;      
  11. BEGIN     
  12.      
  13. OPEN p_cus FOR select empno,ename into v_empno,v_ename  from emp where deptno =v_deptno      
  14.    SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;      
  15. IF(num1=0) THEN     
  16.    INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);      
  17. END IF;      
  18.    SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;      
  19. IF(num2=0)THEN     
  20.    INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);      
  21. ELSE     
  22.     raise_application_error(-202021,'员工id 重复!!!');      
  23. END IF;      
  24.    commit;      
  25.      
  26. END;    

 --1.建包

  1. CREATE OR REPLACE PACKAGE my_pak AS 
  2.  TYPE my_cus IS REF CURSOR  ;  
  3. END my_pak; 

 --2.写存储返回过程

  1. CREATE OR REPLACE PROCEDURE sp_add_emp3(  
  2.    v_empno emp.empno%TYPE,  
  3.    v_ename emp.ename%TYPE,  
  4.    v_deptno dept.deptno%TYPE,  
  5.    v_dname dept.dname%TYPE,  
  6.  
  7.    p_cus OUT my_pak.my_cus  
  8. )AS 
  9.    num1 NUMBER;  
  10.    num2 NUMBER;  
  11. BEGIN 
  12.  
  13. OPEN p_cus FOR select empno,ename into v_empno,v_ename  from emp where deptno =v_deptno   
  14.    SELECT COUNT(*) INTO num1 FROM dept WHERE deptno=v_deptno;  
  15. IF(num1=0) THEN 
  16.    INSERT INTO dept(deptno,dname) VALUES(v_deptno,v_dname);  
  17. END IF;  
  18.    SELECT COUNT(*) INTO num2 FROM emp WHERE empno=v_empno;  
  19. IF(num2=0)THEN 
  20.    INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);  
  21. ELSE 
  22.    raise_application_error(-202021,'员工id 重复!!!');  
  23. END IF;  
  24.    commit;  
  25.  
  26. END

Java JDBC调用Oracle,Java中调用代码3: 

  1. Class.forName("oracle.jdbc.driver.OracleDriver");      
  2. conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");      
  3. conn.setAutoCommit(false);      
  4.      
  5. conn=DBConnection.getDBConnection().getConnection();      
  6.      
  7. String spName="{call sp_add_emp2(?,?,?,?,?)}";      
  8. CallableStatement cstmt=conn.prepareCall(spName);      
  9. cstmt.setInt(1,1111);      
  10. cstmt.setString(2, "qqqq");      
  11. cstmt.setInt(3, 50);      
  12. cstmt.setString(4, "pppp");      
  13. cstmt.registerOutParameter(5, java.sql.Types.ORACLETYPE);      
  14. cstmt.executeUpdate();      
  15. int i = cstmt.getInt(5);      
  16. System.out.println(i);      
  17. cstmt.close();      
  18. conn.close();    

【编辑推荐】

  1. 在Weblogic中实现JDBC的功能
  2. 详解JDBC与Hibernate区别
  3. JDBC连接MySQL数据库关键四步
  4. 五步精通SQL Server 2000 JDBC驱动安装与测试
  5. 详解JDBC驱动的四种类型
  6. JDBC存储过程在Oracle中的获取结果集
责任编辑:彭凡 来源: 百度空间
相关推荐

2009-07-08 17:17:16

JDBC调用存储过程

2010-04-16 11:03:02

Oracle存储过程

2010-10-29 16:12:51

Oracle存储过程

2009-06-22 11:04:00

Jdbc存储过程

2011-08-25 09:31:43

JDBC调用Oracl

2009-07-21 13:50:00

iBATIS.NET调

2011-08-12 11:22:53

Oracle存储过程Java

2011-08-25 11:36:50

PreparedStaJDBC存储过程调用

2009-07-08 17:42:33

JDBC存储过程

2009-06-19 16:22:55

Java存储过程

2017-09-04 11:48:56

MybatisOracle存储过程

2010-04-16 11:11:46

Oracle存储过程

2010-10-26 14:40:31

oracle存储过程

2009-07-17 13:54:51

JDBC存储过程

2010-03-30 13:30:49

Oracle存储

2011-08-23 13:14:05

JDBC带输出参数的存储过程

2010-04-16 16:12:51

jdbc分页

2010-11-12 09:46:55

Sql Server存

2010-05-06 14:01:12

Oracle分页存储过

2010-04-16 11:31:29

Oracle分页存储过
点赞
收藏

51CTO技术栈公众号