创建具有 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 宽度
如何使用 Toad 工具显示 sys_refcursor 输出 pl sql