[我正在mysql上写一个存储过程,但是我不知道为什么当从工作台调用时它给出正确的答案,但是当被PHP API或CLI调用时却给出NULL。
就我而言,过程是这样:
use dummydb
delimiter GO
create procedure myproc (startdate datetime, enddate datetime)
begin
select @startdate as beg, @enddate as fin;
end
GO
delimiter ;
当我从工作台call myproc ("2018-03-01", "2020-11-11");
调用它时,它返回:
beg fin
2018-03-01 2020-11-11
但是当我从CLI调用它时:
mysql> use dummydb
Database changed
mysql> call myproc('2018-03-01','2020-03-01');
+------+------+
| beg | fin |
+------+------+
| NULL | NULL |
+------+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
当我从php调用它时,返回2014
// [....]
$conn = new mysqli("127.0.0.1", "theuser", "thepassword", "dummydb");
$sql = "CALL myproc('2018-03-01', '2020-11-11')";
$result = $conn->query($sql);
var_dump($result->fetch_assoc());
返回此:
array(2) {
'beg' =>
NULL
'fin' =>
NULL
}
如何使它传递正确的值?
您的过程具有输入参数startdate
和enddate
。然后,在您的过程中,您指的是user-defined variables @startdate
和@enddate
。这两个是两个独立的东西。
用户定义的变量是特定于会话的,即,它们在整个会话中保持其值。调用过程时,它将显示会话中的值,而不是输入参数值。在您的工作台会话中,这些变量具有值,但是在您的CLI中没有。
要在过程中使用输入变量,请使用相同的变量(最好使用前缀,因此最终不要将它们与列名混合使用:]
create procedure myproc (in_startdate datetime, in_enddate datetime)
begin
select in_startdate as beg, in_enddate as fin;
end