这是我典型存储过程的开始:
CREATE DEFINER=`joe`@`%` PROCEDURE `Add_Item`(
IN usernameApp VARCHAR(255),
IN barcodeApp VARCHAR(255),
IN quantityApp VARCHAR(255)
)
BEGIN
我会用PHP中的代码来调用它:
CALL Add_Item('ethan', '987261826671', '12');
问题在于我正在寻找更具动态性的东西,我可以在任何顺序中使用参数调用存储过程(因为我无法保证动态应用中的顺序我尝试过创造)。我觉得命名参数会起作用,但我知道MySQL对于程序没有这个功能。
这样的东西会起作用,例如(显然是伪代码):
CALL Add_Item(quantity>'12' name>'ethan', barcode>'987261826671');
想法?
答案 0 :(得分:1)
使用PDO:
$sth = $dbh->prepare('CALL Add_Item(:quantity, :name, :barcode)');
// You can pass paremeters in any order here:
$sth->execute([
':quantity' => 12,
':name' => 'ethan',
':barcode' => '987261826671',
]);
答案 1 :(得分:0)
存储过程的参数是固定的。没有可选参数,订单是固定的。在Perl或Python中没有像命名参数这样的东西。
您可以执行的解决方法如下:
SET @quantity = 12;
SET @name = 'ethan';
SET @barcode = '987261826671';
CALL Add_Item();
换句话说,使用会话变量而不是过程参数。然后,您可以按任何顺序设置会话变量。
只需使用@
前缀即可在过程代码中引用会话变量。会话变量仅在当前会话中可见。
但是这种解决方法对于递归过程并不适用,在递归过程中,您希望在递归调用中将参数传递给过程。
此外,如果您在会话期间多次致电该程序,则必须记住更改这些值,否则先前通话中的值可能会延续到后续通话。
我不得不说这是一个奇怪的问题。许多编程语言,甚至PHP,都要求您使用特定顺序的参数调用函数或过程。这不是一个约束太难了。