有没有办法以任何顺序将参数传递给MySQL存储过程?

时间:2016-08-23 18:50:33

标签: mysql stored-procedures

这是我典型存储过程的开始:

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');

想法?

2 个答案:

答案 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,都要求您使用特定顺序的参数调用函数或过程。这不是一个约束太难了。