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));
    }
  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4255559.html
Copyright © 2011-2022 走看看