带返回值的存储过程

Posted

技术标签:

【中文标题】带返回值的存储过程【英文标题】:Stored Procedure with return values 【发布时间】:2016-01-12 07:36:05 【问题描述】:

我有一个存储过程“test”,它看起来像:

CREATE PROCEDURE test
@name varchar(32)  
AS
DECLARE 
        @login_status  TINYINT, 
    @syb_login   varchar(20),
        @syb_pass   varchar(20)
...
..     


BEGIN   
            SELECT @status = 0
            SELECT @login as login,
                   @pass as pass,
                   @status as status   
             RETURN 0 
        END

我需要将单个输入参数“myName”作为输入参数传递给此过程,然后将登录、传递和状态作为输出(仅来自一条记录)参数返回。

在 JDBC 中,我尝试执行如下操作:

 String query = "call test(?,?,?)";
    System.out.println(query);
    CallableStatement proc = null;
    ResultSet rs;
    try 
        proc = connection.prepareCall(query);
        proc.setString(1, "myName");

    proc.registerOutParameter(2, java.sql.Types.VARCHAR);
    proc.registerOutParameter(3, java.sql.Types.VARCHAR);

    proc.execute();

    System.out.println(proc.getString(2));

这总是给出异常:

java.sql.SQLException: JZ0SG: A CallableStatement did not return as many output parameters as the application had registered for it.
    at com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybStatement.handleSQLE(Unknown Source)
    at com.sybase.jdbc4.jdbc.ParamManager.nextResult(Unknown Source)
    at com.sybase.jdbc4.jdbc.ParamManager.doGetOutValueAt(Unknown Source)
    at com.sybase.jdbc4.jdbc.ParamManager.getOutValueAt(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybCallableStatement.getString(Unknown Source)

我试过JDBC execute SQL Server stored procedure with return value and input/output parameters, https://msdn.microsoft.com/en-us/library/ms378108.aspx 但这不起作用。

【问题讨论】:

显示您的过程的完整创建语句。 输入/输出变量在CREATE PROCEDURE test <params> AS ... 中声明。向我们展示<params> @OlivierGrégoire 我已经添加了 create 语句 你的存储过程只有一个输入(@name),没有输出参数。当参数不存在时,您不能注册参数。您要么必须使用存储过程生成的ResultSet,要么必须重写存储过程,使其具有输出参数。 【参考方案1】:

有两种方式:

1.重新定义您的程序(推荐)

创建存储过程时必须声明输出参数:

CREATE PROCEDURE test
    @name varchar(32),           
    @login varchar(32) = null output,
    @pass varchar(32) = null output,
    @status int = -1 output
AS
BEGIN   
        SET @status = 0
        SELECT @login = logincolumn,
               @pass = passcolumn
        FROM usertable

END

然后你可以将它与 JDBC 一起使用,如下所示:

String query = "call test(?,?,?,?)";
[...]
proc = connection.prepareCall(query);
proc.setString(1, "myName");
proc.registerOutParameter(2, java.sql.Types.VARCHAR);
proc.registerOutParameter(3, java.sql.Types.VARCHAR);
proc.registerOutParameter(4, java.sql.Types.INTEGER);

注意:

您必须将setselect 放入已声明的变量中才能给它们输出 价值观。 通常传递密码不是一个好主意

2。从多个结果集中捕获结果(不推荐)

Connection con;
CallableStatement proc = null;
ResultSet rs;

String qry = "call test(?)";
proc = con.prepareCall(qry);
proc.setString(1, "name");
proc.executeQuery();

// first result set returning the status
rs = proc.getResultSet();
if (rs.next()) 
    System.out.println(rs.getString(1));


 // second result set returning login and pass
if (proc.getMoreResults()) 
    rs = proc.getResultSet();
    if (rs.next()) 
        System.out.println(rs.getString("login"));
        System.out.println(rs.getString("pass"));
    

【讨论】:

您的意思是声明参数名称。是的。我已经完成了.. 只包括了 proc 的第一个和最后一个语句。我现在已经更新了。 我可以确定 proc 工作正常。我可以直接点击并获得输出。但是,不是来自 jdbc 更新了解决方案,以便在您无法更改程序时提供一种方法。 即使 proc 在控制台上工作时运行良好,但它不是应该使用的方式。见msdn.microsoft.com/en-us/library/ms188655.aspx

以上是关于带返回值的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Mysql带返回值与不带返回值的2种存储过程

SQL Server 创建带返回值的存储过程

oracle 执行有返回值的存储过程报错

获取存储过程返回值的几种方式

oracle中调用存储过程时传递参数值的3种方式。。

有无参数之存储过程