所以我们知道,使用 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 约定?
谢谢你。
正如@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 等,它更适合您的情况。