2.4.1 调用存储过程

优质
小牛编辑
125浏览
2023-12-01

在JDBC中调用存储过程需要使用Connection接口的prepareCall方法。prepareCall方法的定义如下:

CallableStatement prepareCall(String sql) throws SQLException;

其中sql参数表示调用存储过程的SQL语句,如果存储过程含有参数,需要使用“?”作为占位符,并使用CallableStatement接口的setXxx方法为参数赋值。setXxx方法可以使用参数名或参数索引来确定参数的位置。使用参数索引的setXxx方法的定义如下:

void setNull(int parameterIndex, int sqlType);

void setBoolean(int parameterIndex, boolean x);

void setByte(int parameterIndex, byte x);

void setShort(int parameterIndex, short x);

void setInt(int parameterIndex, int x);

void setLong(int parameterIndex, long x);

void setFloat(int parameterIndex, float x);

void setDouble(int parameterIndex, double x);

void set BigDecimal(int parameterIndex);

void setString(int parameterIndex, String x);

void setBytes(int parameterIndex, byte x[]);

void setDate(int parameterIndex, java.sql.Date x);

void setDate(int parameterIndex, java.sql.Date x, java.util.Calendar cal);

void setTime(int parameterIndex, java.sql.Time x);

void setTime(int parameterIndex, java.sql.Time x, java.util.Calendar cal);

void setTimestamp(int parameterIndex, java.sql.Timestamp x);

void setTimestamp(int parameterIndex, java.sql.Timestamp x, java.util.Calendar cal);

void setAsciiStream(int parameterIndex, java.io.InputStream x, int length);

void setBinaryStream(int parameterIndex, java.io.InputStream x, int length);

void setCharacterStream(int parameterIndex, java.io.Reader r, int length);

void setObject(int parameterIndex, Object x);

void setObject(int parameterIndex, Object x, int targetSqlType);

void setObject(int parameterIndex, Object x, int targetSqlType, int scale);

void setRef(int parameterIndex, Ref r);

void setBlob(int parameterIndex, Blob b);

void setClob(int parameterIndex, Clob c);

void setArray(int parameterIndex, Array a);

void setNull(int parameterIndex, int sqlType, String typeName);

void setURL(int parameterIndex, java.net.URL url);

使用参数名的setXxx方法的定义和上面的代码类似,只是方法的第一个参数是参数名(String类型),而不是参数索引。在使用prepareCall方法之前,先用如下的SQL语句建立一个存储过程,这个存储过程有一个输入参数:id,一个输出参数:total。存储过程的功能是统计t_booksale表中bookid字段的值等于id的图书销售总量。建立存储过程的SQL语句如下:

  DROP PROCEDURE IF EXISTS mydb.p_myproc; 


  DELIMITER //

  CREATE PROCEDURE mydb.p_myproc(IN id int, OUT total int)

  begin

    SELECT sum(amount) INTO total FROM mydb.t_booksale WHERE bookid = id;

  end //

  DELIMITER ;

对于存储过程的输出参数,需要使用registerOutParameter方法进行注册,registerOutParameter方法的定义如下:

void registerOutParameter(int parameterIndex, int sqlType) throws SQLException;

void registerOutParameter(String parameterName, int sqlType) throws SQLException;

从方法定义可以看出,registerOutParameter方法也可以使用参数索引或参数名来注册输出参数。其中sqlType参数表示输出参数的类型,它的值是java.sql.Types类定义的类型值中的一个。最后,可以使用getXxx方法获得输出参数返回的值。getXxx方法和setXxx方法类似,也可以通过参数索引或参数名来指定参数,使用参数索引的getXxx方法的定义如下:

String getString(int parameterIndex);

boolean getBoolean(int parameterIndex);

byte getByte(int parameterIndex);

short getShort(int parameterIndex);

int getInt(int parameterIndex);

long getLong(int parameterIndex);

float getFloat(int parameterIndex);

double getDouble(int parameterIndex);

java.math.BigDecimal getBigDecimal(int parameterIndex);

byte[] getBytes(int parameterIndex);

java.sql.Date getDate(int parameterIndex);

java.sql.Time getTime(int parameterIndex);

java.sql.Timestamp getTimestamp(int parameterIndex);

Object getObject(int parameterIndex);

Object getObject(int parameterIndex, java.util.Map);

Ref getRef(int parameterIndex);

Blob getBlob(int parameterIndex);

Clob getClob(int parameterIndex);

Array getArray(int parameterIndex);

java.net.URL getURL(int parameterIndex);

下面是一个调用存储过程的例子,代码如下:

public class StoredProcedure

{

    public static void main(String[] args) throws Exception

    {

        Class.forName("com.mysql.jdbc.Driver");

        Connection conn = DriverManager.getConnection(

                "jdbc:mysql://localhost/mydb?characterEncoding=UTF8",

                "root", "1234");

        CallableStatement cstmt = conn.prepareCall("call p_myproc(?, ?)");

// 向输入参数传值

        cstmt.setString(1, "2");   

// 注册输出参数                          

        cstmt.registerOutParameter(2, java.sql.Types.INTEGER); 

// 调用存储过程

        cstmt.executeUpdate();

// 获得输出参数返回的值

        System.out.println(cstmt.getInt(2)); 

        cstmt.close();

        conn.close();               

    }

}