mysql 返回存储过程

说白了,处理MySQL存储过程的返回值主要有两种方式:返回单个值和返回结果集。
其实很简单。
当返回单个值时,只需使用OUT参数。
在我们去年跑的项目中,我们使用OUT参数返回用户数,大约是。
3 000.先说最重要的。
创建存储过程时必须声明 OUT 参数,如下所示:CREATE PROCEDURE procedure_name (INparameter_name DATA_TYPE, OUT out_parameter_name DATA_TYPE)。
还有一点,您需要在存储过程中使用 SET 语句为 OUT 参数赋值,如下所示: SET out_parameter_name = (SELECT COUNT() FROM table_name WHERE column_name =parameter_name)。

一开始我以为OUT参数只能返回一个值,后来发现是错误的。
事实上,它可以根据需要返回多个值。
还有另一个关键细节。
调用存储过程时,传递一个用户变量来接收 OUT 参数的值,如下所示:CALL procedure_name(parameter_value, @out_parameter_value),然后通过 SELECT @out_parameter_value 检索返回值。

说到返回结果集,这个就比较复杂了,需要使用CURSOR(游标)来操作。
您必须在存储过程中声明游标,打开游标,获取数据,完成该过程,最后关闭游标。
操作过程是这样的:DECLAREcursor_nameCURSORFORSELECTcolumn_nameFROMtable_name,然后OPENcursor_name,然后FETCHcursor_nameINTOvariable_name,然后使用WHILE@@FETCH_STATUS = 0DO查看是否所有行都交叉了,在CLOSE,cursor_name中处理数据。

等一下,还有一件事。
使用存储过程时,变量名和关键字不能重名,参数名和数据表列名不能重名,否则会造成语法冲突或歧义。
调用存储过程时必须加括号,否则会报语法错误。
多个 SQL 语句必须用分号分隔,但为了避免提前终止,您可能需要通过 DELIMITER 临时更改分隔符。

我认为值得尝试的是,在实际应用中,从简单的存储过程开始,逐步进入复杂的CURSOR操作,这样可以更好地理解存储过程的运行原理。

mysql存储过程异常

嘿,看起来您的 MySQL 存储过程有问题。
这真的很烦人,当发生不寻常的事情时我会感到非常头痛。
我将我遇到的情况和解决方案总结给您,看看是否适合您。

上周,一位客户问我,他的存储过程突然停止运行并卡在那里。
我让他先看一下日志,他说日志里只有一句话:“程序超时”,时间戳也很清楚。
我告诉他第一步是捕捉异常。
如果没有异常,你就不知道错误出在哪里。

发现异常的关键是阅读日志。
我自己遇到的一个陷阱是,有时默认的日志级别不够,你必须手动增加它。
例如在my.cnf中添加log_error_verbosity = 3 ,这样出现错误时信息才会完整。
记录的时候,记下存储过程的名称,是否超时或者权限问题,发生的时间以及到底出了什么问题。
此信息非常重要,可以帮助您快速找到它。

捕获异常后,第二步就是看代码。
上次在杭州调试一个项目时,发现存储过程中变量赋值错误,导致后面的SQL全部错误。
看一下代码。
变量名是否拼写错误或类型不匹配?还有嵌套调用类型。
有时嵌套太深或者循环状态写得不好,运行时调用超时。
你最好使用MySQL Workbench连接它并逐行调试,或者直接导出代码并使用文本编辑器慢慢阅读。

参数问题也很常见。
我记得去年在北京帮助公司解决了一个bug。
存储过程参数的顺序颠倒了,整个查询结果变得一团糟。
检查时不仅要检查数据类型是否正确,还要检查顺序和默认值是否有问题。
如果在调用过程中出现问题,那么你需要发出调用语句,看看参数是如何传递的。

数据库连接问题也经常出现。
上次我的一个朋友发现了它。
服务器的IP地址写错了,客户端根本无法连接。
检查连接字符串、用户名、密码和端口是否设置正确。
特别是在使用 JDBC 或 ODBC 连接时,必须仔细进行此配置。

如果以上检查都没有用,可能是存储过程本身需要优化。
例如,我前面提到的超时可能是因为查询太慢。
您可以尝试组合几个类似的 SQL 查询或为经常查询的表添加索引。
有些客户使用索引。
以前一秒查询太慢了。
添加索引后,需要几十毫秒。
还有一些类型的缓存。
如果存储过程中有多次重复查询,可以先存储结果,以后直接检索,无需再次运行SQL。

总之,解决存储过程异常没有捷径,只能一层层剥开。
如果实在搞不懂,最好参考官方文档或者在社区提问,贴出你的日志、代码和参数。
总有一些东西可以读。

试试这个方法。
如果你还有问题,请告诉我,我会帮助您。