如何让Unix脚本仅获取MySQL存储过程的OUT参数而非调试输出
分离MySQL存储过程OUT参数与调试输出的Shell实现
问题场景
调用包含调试打印语句的MySQL存储过程时,Shell脚本通过mysql命令捕获的输出会同时包含调试信息和OUT参数值,导致无法直接将整数类型的OUT参数赋值给变量用于后续判断。需要保留调试语句用于日志,同时单独提取OUT参数。
当前脚本执行后输出混有调试内容:
proc started proc ended 1043
解决方案
方法1:修改存储过程,将调试输出定向到stderr
将存储过程中的调试SELECT语句重定向到标准错误流(stderr),这样mysql命令的标准输出(stdout)仅保留OUT参数的查询结果,Shell变量即可直接捕获纯净的OUT参数值,调试信息则可通过stderr输出到终端或日志文件。
修改后的存储过程代码:
CREATE PROCEDURE `delete_me`(out success int) BEGIN DECLARE var1 INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SHOW ERRORS; ROLLBACK; SET success=1; END; START TRANSACTION; select max(run_id) into var1 from job_run; -- 调试信息输出到stderr SELECT 'proc started' INTO OUTFILE '/dev/stderr'; SELECT 'proc ended' INTO OUTFILE '/dev/stderr'; SET success:= var1; END;
对应的Shell脚本:
# 仅捕获stdout中的OUT参数,调试信息会输出到终端 output_var=$(mysql -sN test_db -e "call delete_me(@outs);select @outs") echo "OUT参数值: $output_var" # 若需将调试信息保存到日志文件,可重定向stderr # output_var=$(mysql -sN test_db -e "call delete_me(@outs);select @outs" 2> procedure_debug.log)
方法2:不修改存储过程,通过Shell命令过滤输出
如果无法修改存储过程,可利用Shell文本处理工具从混编输出中提取最后一行(因OUT参数的SELECT是最后执行的语句,结果位于输出末尾),或过滤整数格式的内容。
取最后一行:
output_var=$(mysql -sN test_db -e "call delete_me(@outs);select @outs" | tail -n 1) echo $output_var
过滤整数:
output_var=$(mysql -sN test_db -e "call delete_me(@outs);select @outs" | grep -E '^[0-9]+$') echo $output_var
方法对比
- 方法1更可靠:调试信息与OUT参数完全分离,不受存储过程输出行数变化影响,调试信息可独立管理。
- 方法2适用于无法修改存储过程的场景,但需确保调试输出的最后一行或整数内容唯一对应OUT参数,否则可能出现错误提取。
内容的提问来源于stack exchange,提问作者santhosh
相关产品推荐
相关产品推荐

