经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
Oracle 的存储过程以及用jdbc调用存储过程
来源:cnblogs  作者:hengly94  时间:2019/4/8 12:39:35  对本文有异议

存储过程 就是一组用于完成特定功能的PL/SQL 具名语句块,该SQL语句集经过编译后存储在数据库系统中。在使用时候,我们只需要通过指定已经定义的存储过程名字并给出对应的参数来执行 

存储过程的定义语法

create or replace procedure 过程名(参数名 参数模式 参数类型,参数名 参数模式 参数类型,..... )

is

    这里是声明变量的区域

begin 

    这里是执行的语句块

end;

end 过程名;

注意:当我们定义参数类型时 只能定义他的类型 不能定义他的长度 

 参数模式:in 输入的参数 ,一般为查询参数

                out 输出的参数 

                in out 既能当做输入的参数 也能当做输出的参数

 如果是没有参数的存储过程,则过程名后不能有()

定义一个存储过程没有参数

  1. 1 --存储过程 没有参数
  2. 2 create or replace procedure first_pro
  3. 3 is
  4. 4 begin
  5. 5 DBMS_OUTPUT.PUT_LINE('hello_pro');
  6. 6 end first_pro;
  7. 7
  8. 8
  9. 9 -- 执行存储过程
  10. 10 begin
  11. 11 first_pro();
  12. 12 end;
  1. 1 -- 定义一个存储过程,要求传入两个参数,都是数字,实现两个数相加,并将结果返回
  2. 2 create or replace procedure sum_pro(x in number ,y out number)
  3. 3 is
  4. 4
  5. 5 begin
  6. 6 y:=x+y;
  7. 7 end sum_pro;
  8. 10 --执行存储过程
  9. 11 declare
  10. 12 res number;
  11. 13 begin
  12. 14 -- 注意 当参数模式为 out, in out 那么在传参的时候 我们不能直接去传值而是应该传一个变量
  13. 15 res:=3;
  14. 16 sum_pro(4,res);
  15. 17 end;

  1. 1 -- 设计一个存储过程,用于根据员工编号,查询出一条员工记录
  2. 2 create or REPLACE PROCEDURE getempbyid_pro(eno in emp.empno%type, emp out emp%rowtype)
  3. 3 is
  4. 4 begin
  5. 5 select *into emp from emp where empno=eno;
  6. 6 end getempbyid_pro;
  7. 7
  8. 8
  9. 9 -- 执行存储过程
  10. 10 DECLARE
  11. 11 -- 这里的eno可在调用过程名的时候直接传值 也可以将值给一个变量 因为他是一个输入参数
  12. 12 -- eno emp.empno%type:=7369;
  13. 13 emp1 emp%rowtype;
  14. 14 begin
  15. 15 getempbyid_pro(7369,emp1);
  16. 16 DBMS_OUTPUT.put_line(emp1.ename);
  17. 17 end ;
  18. 18

使用jdbc连接并操作数据库

1.首先要想连接数据库的话就必须要有一个驱动包 ojdbc6.jar  如果安装的jdk5.0之前的可以使用6以下的版本 我的是jdk8.0 这个包在我们安装oracle的时候就已经帮我们下好了

我们只需要在oracle的下载路径下去找就可以找到 不用下

 

 2 接下来就可以去连接Oracle了 注意当我们创建连接的时候 最好先测试一下看连接是否成功 成功了 然后在往下面编写代码 连接成功后

1)先要获得存储过程的语句对象

2).然后在为输入参数赋值

3).注册输出参数类型

4).获取数据

5).关闭资源

 

  1. 1 package jdbc_oracle;
  2. 2 import java.sql.CallableStatement;
  3. 3 import java.sql.Connection;
  4. 4 import java.sql.DriverManager;
  5. 5 import java.sql.ResultSet;
  6. 6 import java.sql.SQLException;
  7. 7 import oracle.jdbc.OracleTypes;
  8. 8 public class Test1 {
  9. 9 public static void main(String[] args) throws SQLException {
  10. 10 // 获取连接
  11. 11 Connection con = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/orcl", "hengly", "hengly");
    System.out.println("连接成功");
  12. 12 // 获得可以执行存储过程的语句对象 , ?代表的是参数, emp_package是我在orcale中定义的包头的名称 ,getEmpbyId 是存储过程的名称
  13. 13 CallableStatement cs = con.prepareCall("call emp_package.getEmpbyId(?,?)");
  14. 14 // 为存储过程设值 为第一个参数赋值 输入参数可以直接赋值
  15. 15 cs.setInt(1, 7369);
  16. 16 // 为cs注册输出参数类型 如果为输出参数就必须要注册
  17. 17 cs.registerOutParameter(2, OracleTypes.CURSOR);
  18. 18 // 执行
  19. 19 cs.execute();
  20. 20 // 获取数据
  21. 21 ResultSet res = (ResultSet) cs.getObject(2);
  22. 22 // 算出有多少列
  23. 23 int num = res.getMetaData().getColumnCount();
  24. 24 while (res.next()) {
  25. 25 for (int i = 0; i < num; i++) {
  26. 26 String s1 = res.getString(i + 1);
  27. 27 System.out.print(s1 + " ");
  28. 28 }
  29. 29 }
  30. 30 // 关闭资源, 先开后关闭
  31. 31 res.close();
  32. 32 cs.close();
  33. 33 con.close();
  34. 34
  35. 35 }
  36. 36
  37. 37 }
  1. 1 CREATE OR REPLACE PACKAGE emp_package
  2. 2 AS
  3. 3 -- 定义一个动态游标
  4. 4 TYPE emp_cursor IS REF CURSOR;
  5. 5 -- 定义一个根据编号查询信息的存储过程
  6. 6 PROCEDURE getEmpbyId(eno emp.empno%type,ec out emp_cursor);
  7. 7 END emp_package ;
  8. 8
  9. 9 -- 编写包体
  10. 10 CREATE OR REPLACE PACKAGE BODY emp_package
  11. 11 AS
  12. 12 PROCEDURE getEmpbyId(eno emp.empno%type,ec out emp_cursor)
  13. 13 AS
  14. 14 BEGIN
  15. 15 OPEN ec FOR select * from emp where empno=eno;
  16. 16 END getEmpbyId ;
  17. 17 END emp_package ;

 

 

原文链接:http://www.cnblogs.com/hengly/p/10652235.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号