zoukankan      html  css  js  c++  java
  • Java 调用存储过程、函数

     一、Java调用存储Oracle存储过程

      测试用表:  

    --创建用户表
    create table USERINFO
    (
      username VARCHAR2(50) not null,
      password VARCHAR2(50) not null,
      email    VARCHAR2(50) not null
    )

      1、调用输入参数的存储过程,无返回值

    --添加用户记录
    create or replace procedure pro_userinfo_insert(username VARCHAR2,password VARCHAR2,email VARCHAR2) is
    begin
      INSERT INTO userinfo VALUES(username,password,email);
      COMMIT;
    end pro_userinfo_insert;

      调用

    //省略jdbc其他代码
    
    //调用存储过程
    CallableStatement call = con.prepareCall("{call pro_userinfo_insert(?,?,?)}");
    //传递参数
    call.setString(1, "wangwu");
    call.setString(2, "123123");
    call.setString(3, "wangwu@163.com");
    //执行方法,调用存储过程
    int result = call.executeUpdate();
    //返回受影响的行数
    System.err.println(result);

      2、调用带输出参数的存储过程,返回单个值

    --获取用户的记录总数
    create or replace procedure pro_userinfo_SelectCount(
      v_count OUT INT
    )is
    begin
      SELECT COUNT(*) INTO v_count FROM Userinfo;
    end pro_userinfo_SelectCount;

      调用代码

    //调用存储过程
    CallableStatement call = con.prepareCall("{call pro_userinfo_selectcount(?)}");
    //传递参数
    call.registerOutParameter(1, Types.INTEGER);
    call.execute();
    System.out.println(call.getInt(1));

      注意,这里的proc.getInt(1)中的数值1并非任意的,而是和存储过程中的out列对应的,如果out是在第二个位置,那就是proc.getInt(2),如果是第三个位置,就是proc.getInt(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

      

      3、返回列表的存储过程

      由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。

      创建游标类型:

    --声明一个包,在包中声明公共的游标类型
    create or replace package shop_package IS
      --声明一个游标类型
      TYPE ref_cursor IS REF CURSOR;
    end shop_package;

      创建带游标的存储过程:

    --带输出游标的存储过程,参数类型为刚才创建的包中的游标类型
    create or replace procedure pro_userinfo_select(cur OUT shop_package.ref_cursor) is
    begin
        --游标进行绑定查询的sql语句
        OPEN cur FOR SELECT * FROM userinfo;
    end pro_userinfo_select;

      Java调用代码

    //调用存储过程
    CallableStatement call = con.prepareCall("{call pro_userinfo_select(?)}");
    //设置输出参数类型为游标类型
    call.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    call.execute();
    //将游标类型转换为数据集,然后遍历数据集即可
    ResultSet rs = (ResultSet) call.getObject(1);
    System.out.println("姓名		邮箱");
    while(rs.next()){
        System.out.println(rs.getString(1) + "		" + rs.getString(3));
    }

    二、Java调用函数

      1、调用函数,返回单个值

    --根据用户名称获取Email函数,返回字符串格式
    create or replace function fun_userinfo_selectEmail(v_username varchar2) 
      return varchar2 
    is
      v_email VARCHAR2(50);
    begin
      SELECT email INTO v_email FROM Userinfo WHERE username=v_username;
      return(v_email);
    end fun_userinfo_selectEmail;

      Java调用

    //调用函数
    CallableStatement call = con.prepareCall("{?=call fun_userinfo_selectemail(?)}");  //这里必须使用{},否则会报错!
    //设置参数,1为函数返回值,2为传递到函数中的参数
    call.registerOutParameter(1, Types.VARCHAR);
    call.setString(2, "zhangsan");
    call.execute();
    System.out.println(call.getString(1));

      2、调用返回游标的函数

    --返回游标类型的函数,游标为前面在包中定义的游标类型
    create or replace function fun_userinfo_select return shop_package.ref_cursor is
       ref_cur shop_package.ref_cursor;
    begin
      OPEN ref_cur FOR SELECT * FROM userinfo;
      return(ref_cur);
    end fun_userinfo_select;

      Java调用

    //调用函数
    CallableStatement call = con.prepareCall("{?=call fun_userinfo_select()}");
    //设置返回值类型为游标
    call.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    call.execute();
    
    ResultSet rs = (ResultSet) call.getObject(1);
    System.out.println("姓名		邮箱");
    while(rs.next()){
        System.out.println(rs.getString(1) + "		" + rs.getString(3));
    }
  • 相关阅读:
    Python网络协议(osi七层协议)
    Python面向对象之反射,双下方法
    Python类的成员
    Python异常处理
    mysql 索引 慢查询优化 && 数据库性能优化
    数据库(视图、事务、存储过程、函数) && 数据库备份
    mysql数据库连接模块 pymysql && sql注入
    主线程与子线程的关系
    socket 编程实例 基于线程池实现服务端并发
    日常迷惑积累
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4255559.html
Copyright © 2011-2022 走看看