【问题标题】:OUT parameter declaration in stored procedure存储过程中的 OUT 参数声明
【发布时间】:2020-01-31 10:14:51
【问题描述】:

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

我有这段代码,它可以工作,但我被要求插入 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 

【问题讨论】:

标签: php mysql stored-procedures


【解决方案1】:

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

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            |
+-------------+--------------+

【讨论】:

  • 感谢答案,我知道 CountMacro1 与 @CountMacro1 不同。其中 CountMacro1 是局部变量。但是为什么当我手动插入 0,0,0,0 作为输入值(来自 mysql 工作台)时,我得到了正确的计数输出?此外,我尝试了“DECLARE CountMacro1 INT DEFAULT 0;”,但他仍然要求我输入值。
  • 对不起,我没明白你的意思。我在这里创建了一个类似的程序 -> CLICK THIS DEMO 并且工作正常。我可以获得CountMacro2default 值。你能在这里复制你的问题吗? @DomenicoSchitti
  • 问题是,当我运行程序时,我仍然得到这个输入框,他要求我插入值:ibb.co/Rz5t82t。抱歉,我不明白如何更改它 D:,我只想让我的程序在四个变量中输出我的四行数。
  • 你是如何调用程序的?您是否同时运行call()selectCheck this link once
  • 我正在工作台上测试它,点击存储过程名称旁边的照明按钮,程序执行调用和选择,就像我在问题中写的一样。
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2014-01-01
  • 2011-07-29
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多