PHP中MySQL PDO调用带命名参数的存储过程是否可行?
MySQL存储过程是否支持命名参数调用?
好问题!我刚好对这个点比较熟悉,来给你捋一捋目前的情况:
首先,截至MySQL 8.0及所有后续稳定版本,官方仍然不支持直接使用命名参数来调用存储过程——也就是说,你没办法像在PostgreSQL或者SQL Server里那样,通过参数名来指定传入的值,只能严格按照存储过程定义时的参数顺序来传递参数。
举个例子,如果我们定义了这样一个存储过程:
CREATE PROCEDURE update_user(IN user_id INT, IN new_email VARCHAR(100), IN new_phone VARCHAR(20)) BEGIN UPDATE users SET email = new_email, phone = new_phone WHERE id = user_id; END;
调用的时候只能按位置传参,比如:
CALL update_user(101, 'new@example.com', '138xxxx1234');
而不能写成:
-- 这种写法在MySQL里会报错,不支持! CALL update_user(user_id => 101, new_phone => '138xxxx1234', new_email => 'new@example.com');
你提到的相关需求请求,应该是指MySQL官方反馈系统里存在多年的那项呼吁,很多开发者都提出过这个需求——毕竟参数多的时候,按位置传参很容易搞混顺序,出错概率高。但遗憾的是,截至目前,这个需求还没有被官方实现,也没有明确的时间表说明何时会支持。
如果一定要模拟类似命名参数的效果,有个折中的办法:可以先把参数赋值给用户变量,再按位置传递,比如:
SET @uid = 101; SET @phone = '138xxxx1234'; SET @email = 'new@example.com'; CALL update_user(@uid, @email, @phone);
这种方式虽然能通过变量名来明确参数含义,但本质上还是按位置传参,只是可读性稍微好一点,算不上真正的命名参数调用。
内容的提问来源于stack exchange,提问作者NoSoup4you
相关产品推荐
相关产品推荐

