如何从存储过程返回值

时间:2014-04-03 09:13:13

标签: java mysql stored-procedures

我有一个MySql过程,它获取一些输入参数,因此选择一个像这样的值:

declare rez int;
///
...some other code...
///
select rez;

现在,我想从另一个存储过程调用该存储过程并获取" selected"值。我试过这样的事情:

declare myVar int;
set myVar = call existingStoredProcedure();

但它不会做。我该怎么办?我正在谷歌搜索解决方案,我发现的所有解决方案都以"创建> existingStoredProcedure<与OUT param"。对我来说,这不是一个选择 - " existingStoredProcedure"因为它在应用程序的许多部分中被使用而无法更改,因此添加另一个参数会要求我预测的很多更改。

有没有办法在不添加" out"的情况下返回值。参数?我是一名Java程序员,所以如果mysql存储过程只能"返回"那将是非常好的。为发出呼叫的任何实体选择的行和值:)

1 个答案:

答案 0 :(得分:1)

如果某个过程只执行select语句,那么您可以将结果读入ResultSet的实例。

CallableStatement cst = con.prepareCall( "{call sql_procedureName()}" );
ResultSet rs = cst.executeQuery();

工作示例

我们假设您有一个存储过程,它返回当前日期和当前日期名称。

drop procedure if exists today;
create procedure today() 
    select @dt:=current_date as today, dayname( @dt ) as dayname;

现在,从JAVA程序中调用它。

CallableStatement cst = con.prepareCall( "{call today()}" );

ResultSet rs = cst.executeQuery();
ResultSetMetaData  rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
System.out.println( "Column Count: " + columnCount );
for ( int i = 1; i <= columnCount; i++ ) {
    System.out.print( ( i == 1 ? "Column Names: " : ", " ) 
                        + rsmd.getColumnLabel( i ) );
} // for each column
System.out.println();

int rowNumber = 1;
while( rs.next() ) {
    for ( int i = 1; i <= columnCount; i++ ) {
        System.out.print( ( i == 1 ? ( "Record " + rowNumber++ + ": " ) : ", " ) 
                         + rsmd.getColumnLabel( i ) + ": " + rs.getString( i ) );
    } // for each column
    System.out.println();
} // while rs

输出

Column Count: 2
Column Names: today, dayname
Record 1: today: 2014-04-03, dayname: Thursday

请参阅