创建具有 SYS_REFCURSOR 作为输出参数的 mysql 过程时出错

Posted

技术标签:

【中文标题】创建具有 SYS_REFCURSOR 作为输出参数的 mysql 过程时出错【英文标题】:error while creating mysql procedure having SYS_REFCURSOR as out param 【发布时间】:2013-09-30 10:14:29 【问题描述】:

我正在创建具有两个参数的过程,一个是 SYS_REFCURSOR 类型的 p_cursor(OUT 参数),另一个是 INT(IN 参数)类型的 p_rank。但它显示一个错误。

DELIMITER $$
CREATE  PROCEDURE sp_student(p_cursor OUT SYS_REFCURSOR,p_rank IN INT) 
    BEGIN
    OPEN p_cursor FOR SELECT  * FROM student WHERE   rank = p_rank;
    END$$
DELIMITER ;

我得到的错误是,

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'OUT SYS_REFCURSOR,p_rank IN INT) 
    BEGIN
    OPEN p_cursor FOR SELECT  * FROM st' at line 1

我认为 SYS_REFCURSOR 在语法上是错误的。请检查我的代码,让我意识到我的错误。 提前致谢

【问题讨论】:

MySql 没有像 Oracle 中那样的 REFCURSOR,请看这个答案:***.com/questions/7155790/… 在mysql中,如果我们想从过程中返回记录集,我们不需要维护params和sys_refcursor,而是直接在过程体中编写select语句。不是Kordiko先生吗? 阅读此链接:dev.mysql.com/doc/refman/5.5/en/…。该过程的结果集返回directly to the client(MySQL、MySlqWorkbench、php、JDBC、ODBC 等)。但如果该过程是从另一个过程调用的,则调用过程无法读取此结果集。临时表可用于将许多行从一个过程传递到另一个过程。 【参考方案1】:

mysql 没有像 oracle 那样的 refcursor,如果你打算编写一个在 mysql 中返回多行/结果集的存储过程就可以了

DROP procedure IF EXISTS `sample`;
DELIMITER $$
CREATE  PROCEDURE `sample`(p_rank IN INT)
BEGIN
select * from MyTable where id=p_rank;
END$$
DELIMITER ;

调用样本(); 这将返回一个结果集。你可以使用哪个。

【讨论】:

以上是关于创建具有 SYS_REFCURSOR 作为输出参数的 mysql 过程时出错的主要内容,如果未能解决你的问题,请参考以下文章

在另一个过程中使用 sys_refcursor 作为 out 参数调用 SP

SQL Developer 脚本输出截断 sys_refcursor 宽度

PLSQL 查看 sys_refcursor 的输出

如何使用 Toad 工具显示 sys_refcursor 输出 pl sql

SYS_REFCURSOR out 参数 - 运行存储过程失败

Oracle ref cursor和sys_refcursor