zoukankan      html  css  js  c++  java
  • JDBC(13)—JDBC调用存储过程和函数

    1. 步骤:
      JDBC调用存储过程和函数
      步骤:

      ①:通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例,在使用Connection对象的preparedCall()方法时,需要传入一个String类型的字符串,该字符串指明如何调用存储过程。
      函数: [? = call [(,, … )]]
      存储过程: [call [(,, … )]]

      ②:通过CallableStatement对象reisterOutParameter方法注册OUT参数

      ③:通过CallableStatement对象setXxx()方法设定IN或IN OUT参数,若想把参数设为null,使用setNull()方法

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

    ⑤:如果调用的是带返回值的存储过程,还需要CallableStatement对象的getXxx()方法获取其返回值。
    注:通过数据字典查看存储过程或函数的定义。

    2 .示例代码
    java调用存储过程

        /**
         * 调用存储过程
         */
        @Test
        public void testCallableStatement(){
            Connection conn = null;
            CallableStatement callablestatement = null;
            try {
                conn = TestTools.getConnection();
                String sql = "{ call add0 (?, ?, ?) }";
                //1.获取CallableStatement类是对象
                callablestatement = conn.prepareCall(sql);
                //2.注册OUT参数
                callablestatement.registerOutParameter(3, Types.NUMERIC);
                //3.通过setXxx()方法设定IN或OUT参数值
                callablestatement.setInt(1, 10);
                callablestatement.setInt(2, 20);
                //4.执行存储过程
                callablestatement.execute();
                //5.若有返回值,需要使用getXxx()接收
                int sum = callablestatement.getInt(3);
                System.out.println("结果:"+sum);//结果:30
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                TestTools.release(callablestatement, conn);
            }
        }

    创建存储过程的SQL语句

    #定义有返回值的存储过程,大小写无所谓,功能:计算两个数的值
    #注意:过程名不能使用add
    
    CREATE PROCEDURE add0(IN a INT,IN b INT,OUT result INT)
    BEGIN
        IF a IS NULL THEN SET a = 0;
        END IF;
        IF b IS NULL THEN SET b = 0;
        END IF;
        SET result = a + b;
        SELECT result AS SUM;
    END;
    
    #调用存储过程
    
    call add0 (10, 20, @result); 
    
    ##定义无返回值的存储过程,大小写无所谓,功能:计算两个数的值
    
    CREATE PROCEDURE add1( a INT, b INT)
    BEGIN
        DECLARE result INT;
        IF a IS NULL THEN SET a = 0;
        END IF;
        IF b IS NULL THEN SET b = 0;
        END IF;
        SET result = a + b;
        SELECT result AS SUM;
    END;
    
    #调用存储过程
    
    call add1 (10, 20); 

    java调用函数

        /**
         * 调用函数
         */
        @Test
        public void testCallableStatement1(){
            Connection conn = null;
            CallableStatement callablestatement = null;
            try {
                conn = TestTools.getConnection();
                String sql = "{? = call add_fun (?, ?) }";
                //1.获取CallableStatement类是对象
                callablestatement = conn.prepareCall(sql);
                //2.注册OUT参数,其中1表示第一个问号,表示输出
                callablestatement.registerOutParameter(1, Types.NUMERIC);
                //3.通过setXxx()方法设定IN或OUT参数值,2,3表示第二个和第三个问号,表述输入。
                callablestatement.setInt(2, 10);
                callablestatement.setInt(3, 20);
                //4.执行存储过程
                callablestatement.execute();
                //5.若有返回值,需要使用getXxx()接收
                int sum = callablestatement.getInt(1);
                System.out.println("结果:"+sum);
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                TestTools.release(callablestatement, conn);
            }
        }

    创建函数的mysql语句:

    #创建有返回值的函数,注意分号不要少
    
    create function add_fun(a int, b int)
    returns int 
    begin
    
            declare c int;
            set c = a + b;
            return c;
    end;
    
    #调用函数
    
    select add_fun(10,10) as sum
  • 相关阅读:
    RT: TCP connection close
    RT: TCP REUSEADDR or REUSEPORT
    RT:How HTTP use TCP connection
    一些英语技巧
    [转] HBase的特征和优点
    [转] Java多线程发展简史
    [转] socket异步编程--libevent的使用
    连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
    出现”/var/lib/mysql/mysql.sock“不存在的解决方法
    eclipse代码编辑器中按alt+/提示No Default Proposals 的解决方法
  • 原文地址:https://www.cnblogs.com/tengpengfei/p/10454009.html
Copyright © 2011-2022 走看看