zoukankan      html  css  js  c++  java
  • MYSQL 之 JDBC(十七): 调用函数&存储过程

    1.通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例。在使用Connection对象的preparedCall()方法时,需要传入一个String类型的字符串,该字符串用于指明如何调用存储过程。(注意:函数名不需要带<>,同理传参也不用[],不能理解的话看例子,不然会报错)

    {?= call <procedure-name> [(<arg1>, <arg2>, ...)]}
    call <procedure-name> [(<arg1>, <arg2>, ...)]}

    2通过CallableStatement对象的registerOutParameter()方法注册OUT参数

    3通过CallableStatement对象的setXxx()方法设定IN或IN OUT参数

    若想将参数默认值设为null,可以使用setNull()方法

    4通过CallableStatement对象的execute()方法执行存储过程

    5如果所调用的是带返回参数的存储过程,还需要通过CallableStatement对象的getXxx()方法获取其返回值

    通过数据字典查看存储过程或函数的定义:select text from user_source where lower(name) = 'add_sal_procedure;'

    实验

    • 我自己写了一个函数

    复制代码

    create function sum_salary(name varchar(20), i int) returns varchar(20)
    begin
    declare result int default 0;
    declare r varchar(20) default 'aaa';
    
    select count(*) into result from t_user where username=name and i = id;
    select if(result>0, '成功!', '失败!') into r;
    return r;
    end;

    复制代码

    这个函数在idea中显示的是

    复制代码

    create
        definer = root@localhost function sum_salary(name varchar(20), i int) returns varchar(20)
    begin
    declare result int default 0;
    declare r varchar(20) default 'aaa';
    
    select count(*) into result from t_user where username=name and i = id;
    select if(result>0, '成功!', '失败!') into r;
    return r;
    end;

    复制代码

    函数的功能是输入用户名和id,查看是否有这个人,测试如下

    复制代码

    package com.litian.jdbc;
    
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.Types;
    
    /**
     * @author: Li Tian
     * @contact: litian_cup@163.com
     * @software: IntelliJ IDEA
     * @file: TestCalllableStatement.java
     * @time: 2020/4/8 12:14
     * @desc: |如何使用JDBC调用存储在数据库中的函数或存储过程
     */
    
    public class TestCalllableStatement {
        public static void main(String[] args){
            Connection conn = null;
            CallableStatement cs = null;
            try {
                conn = JDBCTools.getDSConnection();
    
                // 1. 通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例。
                String sql = "{?= call sum_salary (?, ?)}";
                cs = conn.prepareCall(sql);
    
                // 2. 通过CallableStatement对象的registerOutParameter()方法注册OUT参数
                cs.registerOutParameter(1, Types.VARCHAR);
                // 3. 通过CallableStatement对象的setXxx()方法设定IN或IN OUT参数
                cs.setString(2, "你大爷");
                cs.setInt(3, 3);
                // 4. 执行存储过程
                cs.execute();
                // 5. 获取返回值
                String result = cs.getString(1);
                System.out.println(result);
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCTools.release(null, cs, conn);
            }
        }
    }

    复制代码

    结果直接输出返回值!实验成功!

  • 相关阅读:
    169. Majority Element求众数
    567. Permutation in String字符串的排列(效率待提高)
    51. N-Queens N皇后
    52. N-Queens II N皇后II
    layui的form.val无法动态渲染赋值表单问题解决方法
    layui 父页面获取弹窗传递的值 和 父页面传值给子弹窗的方法
    layui搜索框,监听为空,表格重新加载
    layui form表单 input输入框获取焦点后 阻止Enter回车自动提交
    5月17日 日期格式遇到一些问题
    Layui关闭弹出层并刷新父窗口
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13308992.html
Copyright © 2011-2022 走看看