php - 存储过程中的 OUT 参数声明

标签 php mysql stored-procedures

请原谅我问了一个非常简单的问题,但我无法从类似的问题中理解我必须做什么。

我有这段代码,它可以工作,但我被要求插入 CountMacro1、CountMacro2、CountMacro3、CountMacro4 的输入值,该值始终为 0。我如何向 mysql 解释我希望将这些变量设置为 0?设置@CountMacro1 = 0;似乎不起作用,为什么?谢谢大家:D

Mysql 工作台执行如下调用和选择:

set @CountMacro1 = 0;
set @CountMacro2 = 0;
set @CountMacro3 = 0;
set @CountMacro4 = 0;
call dbcbt.CountMacro_Audit_Scaduti(@CountMacro1, @CountMacro2, @CountMacro3, @CountMacro4);
select @CountMacro1, @CountMacro2, @CountMacro3, @CountMacro4;

这就是 php 中的调用:

$conn = new PDO("mysql:host=$servername;dbname=dbcbt", $username, $password);


$sql = 'CALL CountMacro_Audit_Scaduti(@CountMacro1_OUT,@CountMacro2_OUT,@CountMacro3_OUT,@CountMacro4_OUT)';
$stmt = $conn->prepare($sql);

$CountMacro1_OUT = 0;
$CountMacro2_OUT = 0;
$CountMacro3_OUT = 0;
$CountMacro4_OUT = 0;

$stmt->bindParam(1, $CountMacro1_OUT, PDO::PARAM_INT, 10);
$stmt->bindParam(2, $CountMacro2_OUT, PDO::PARAM_INT, 10);
$stmt->bindParam(3, $CountMacro3_OUT, PDO::PARAM_INT, 10);
$stmt->bindParam(4, $CountMacro4_OUT, PDO::PARAM_INT, 10);

print "Values of bound parameters _before_ CALL:\n";
print "  1: {$CountMacro1_OUT} 2: {$CountMacro2_OUT} 3: {$CountMacro3_OUT} 4: {$CountMacro4_OUT}\n";

$stmt->execute();

print "Values of bound parameters _after_ CALL:\n";
print "  1: {$CountMacro1_OUT} 2: {$CountMacro2_OUT} 3: {$CountMacro3_OUT} 4: {$CountMacro4_OUT}\n";
CREATE DEFINER=`root`@`localhost` PROCEDURE `CountMacro_Audit_Scaduti`(
OUT CountMacro1 int,
OUT CountMacro2 int,
OUT CountMacro3 int,
OUT CountMacro4 int
)
BEGIN
set @CountMacro1 = 0;
set @CountMacro2 = 0;
set @CountMacro3 = 0;
set @CountMacro4 = 0;

select count(*)
INTO CountMacro1
from t_audit
WHERE (t_audit.Data_Scadenza < NOW()) AND (t_audit.Data_Completamento ="" OR t_audit.Data_Completamento is null) AND (t_audit.Macro1= 1 OR t_audit.Macro2= 1 OR t_audit.Macro3= 1);

select count(*)
INTO CountMacro2
from t_audit
WHERE t_audit.Data_Scadenza < NOW() AND (t_audit.Data_Completamento ="" OR t_audit.Data_Completamento is null) AND (t_audit.Macro1= 2 OR t_audit.Macro2= 2 OR t_audit.Macro3= 2);

select count(*)
INTO CountMacro3
from t_audit
WHERE t_audit.Data_Scadenza < NOW() AND (t_audit.Data_Completamento ="" OR t_audit.Data_Completamento is null) AND (t_audit.Macro1= 3 OR t_audit.Macro2= 3 OR t_audit.Macro3= 3);

select count(*)
INTO CountMacro4
from t_audit
WHERE t_audit.Data_Scadenza < NOW() AND (t_audit.Data_Completamento ="" OR t_audit.Data_Completamento is null) AND (t_audit.Macro1= 4 OR t_audit.Macro2= 4 OR t_audit.Macro3= 4);

END 

最佳答案

您可以声明局部变量,然后可以分配默认值。

CREATE PROCEDURE MYPROC(var OUT) 
BEGIN   
   DECLARE CountMacro1 INT DEFAULT 0;  
   DECLARE CountMacro2 INT DEFAULT 0;
   DECLARE CountMacro3 INT DEFAULT 0;  
   DECLARE CountMacro4 INT DEFAULT 0;
   --Your code
END;

在您的情况下,您尝试将默认值分配给@CountMacro1,即 User defined variables并且在您的查询中,您将计数分配给局部变量 CountMacro1。两者是不同的。

您可以运行以下过程来查看差异

CREATE PROCEDURE prc_test ()
BEGIN
    DECLARE CountMacro1  INT DEFAULT 1;
    SET @CountMacro1  = 2;
    SELECT  CountMacro1 , @CountMacro1 ;
END;

输出

+-------------+--------------+
| CountMacro1 | @CountMacro1 |
+-------------+--------------+
| 1           | 2            |
+-------------+--------------+

关于php - 存储过程中的 OUT 参数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60001904/

相关文章:

php - 无法从 mysqli 进行 Base64 解码

mysql - 这条 MySQL 语句是做什么的?

mysql - 如何在mysql中构建一个用于检测过期许可证的表?

linq - 使用 Linq-To-Sql 执行存储过程后是否需要 SubmitChanges?

php - 使用 PHP 的外部样式表中的分隔符运算符

php - MYSQL 按最近的 UTM 坐标对结果进行排序

mysql - 这两个mysql操作符有什么区别

asp.net - 尝试执行存储过程时出现无效的对象名称错误?

mysql - 在存储过程中获取一周中的天数

php - WooCommerce API 不使用 SKU 创建产品