浅析Java JDBC调用Oracle存储过程

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

创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都网站建设、清江浦网络推广、成都小程序开发、清江浦网络营销、清江浦企业策划、清江浦品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供清江浦建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

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中的获取结果集

本文名称:浅析Java JDBC调用Oracle存储过程
文章分享:http://www.shufengxianlan.com/qtweb/news3/516503.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联