ODBC - MySQL 存储过程支持返回值吗?

问题描述 投票:0回答:1

所以我们知道,使用 MS SQL Server,在存储过程中我们可以编写类似“RETURN 6”的内容,而在使用 ODBC 的(C++)应用程序中,我可以编写

SWORD returnValueHolder = 0, sParm = 1;  
RETCODE retcode = SQLBindParameter(hstmt1, 1, SQL_PARAM_OUTPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &returnValueHolder, 0, &cbParm1);
retcode = SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &sParm, 0, &cbParm2);  
retcode = SQLExecDirect(hstmt1, (UCHAR*)"{? = call TestParm(?)}", SQL_NTS);  

请参阅此 MS Learn 页面以供参考。

当然,MySQL 不支持存储过程中的 RETURN,因此在我的存储过程中我只是简单地执行了“SELECT @returnVal”。

问题:好像有一样的约定? = 之前调用 TestParm(?) MySQL ODBC 驱动程序不支持?当我这样做时,我收到 [unixODBC][Driver Manager]函数序列错误

我使用 UnixODBC 作为驱动程序管理器,我的 MySQL 驱动程序是 8.0.29。

供参考,我的测试存储过程:

DELIMITER //
CREATE PROCEDURE `TestProc` ( 
    IN StaffId int ) 
BEGIN 
    SELECT `Age` INTO @returnVal FROM `Staff` WHERE `Staff`.`StaffId` = StaffId; 
    SELECT @returnVal;
END; 
// 
DELIMITER ;

这似乎只是给我一个结果集,就像存储过程中的任何其他正常 SELECT 一样。 MySQL 是否无法在存储过程中返回值以允许我使用 ? = 调用 TestParm(?) ODBC 约定?

谢谢你。

mysql stored-procedures return odbc return-value
1个回答
0
投票

正如@shadow指出的,您可以在存储过程中使用参数OUT。这里我制作了一个返回输入的大写值的示例:

DELIMITER //
CREATE PROCEDURE `sp_test`(IN PARAM VARCHAR(40), OUT RESULT VARCHAR(40))
BEGIN

SET RESULT=UPPER(PARAM);

END //
DELIMITER ;

要使用上面的存储过程,您可以:

call sp_test('i am awesome',@out_value);

select @out_value;

输出:

@out_value = '我太棒了'

但我不建议这样做。使用 FUNCTION 代替:

DELIMITER //
CREATE FUNCTION `fn_test`(PARAM VARCHAR(40)) RETURNS VARCHAR(40)
    DETERMINISTIC
BEGIN

RETURN upper(PARAM);

END //

DELIMITER ;

使用上述功能:

select fn_test('we are awesome') as out_value;

输出:

out_value = '我们太棒了'

如上面的示例,您可以看到函数更加灵活,您可以在任何查询中使用它,如 select、insert、update 等,它更适合您的情况。

© www.soinside.com 2019 - 2024. All rights reserved.