【问题标题】:Getting a result from a prepared statement into a variable从准备好的语句中获取结果到变量中
【发布时间】:2021-05-03 08:24:17
【问题描述】:

我一直在尝试将准备好的语句中的结果转换为变量。我环顾四周,发现了我想做的事情,但是我不确定如何正确实现它。这就是我尝试过的方式,但是当我运行它时,它会在表格中插入空白。

Drop procedure if exists campaignTEST;

DELIMITER  $$

Create procedure campaignTEST(in userID smallint)
sp_Campaign17:BEGIN

Declare activityCount mediumint;
Declare lastActivityDate DateTime;

Declare TableName varchar(64);

SET TableName = 'user_activity_';  
SET TableName = concat(TableName, convert(userID,char(64)));

SET @lastActivityDateTest = ('SELECT @date := date from ' ,TableName, ' order by date desc limit 1;');  
    PREPARE stmt FROM @lastActivityDateTest;  
    EXECUTE stmt;  
    Select @date AS lastActivityDate;  
    DEALLOCATE PREPARE stmt;

SET @activityCountTest = ('Select @count := count(*) from ' ,TableName, ' where Month(date) > Month(Date_SUB(CURRENT_date, Interval 1 month));');  
    PREPARE stmt FROM @activityCountTest;   
    EXECUTE stmt;  
    select @count as activityCount;
    DEALLOCATE PREPARE stmt;

INSERT INTO email_tracker
(activity_date,  allocated)
Values
(lastActivityDate, activityCount)

END$$

DELIMITER ;

【问题讨论】:

  • 我会使用 select..into 和 SET activitycount 顺便说一句,您可以将 2 列选择为 2 个变量。
  • 我已经尝试过了,但是我从表名中提取的表会根据传递到过程中的用户而改变。这需要动态sql语句,因此使用准备好的语句,即使1是表的计数,您可以选择2个变量吗?
  • 啊,我好像没听懂你在说什么。

标签: mysql variables stored-procedures mysql-workbench prepared-statement


【解决方案1】:

在朋友的帮助下,我设法让它工作起来。

这些陈述,

SET @lastActivityDateTest = ('SELECT @date := date from ' ,TableName, ' order by date desc limit 1;');  
    PREPARE stmt FROM @lastActivityDateTest;  
    EXECUTE stmt;  
    Select @date AS lastActivityDate;  
    DEALLOCATE PREPARE stmt;

SET @activityCountTest = ('Select @count := count(*) from ' ,TableName, ' where Month(date) > Month(Date_SUB(CURRENT_date, Interval 1 month));');  
    PREPARE stmt FROM @activityCountTest;   
    EXECUTE stmt;  
    select @count as activityCount;
    DEALLOCATE PREPARE stmt;

INSERT INTO email_tracker
(activity_date,  allocated)
Values
(lastActivityDate, activityCount)

应该是这样的

SET @statement = CONCAT('SELECT date into @result from ', TableName, ' ORDER BY date DESC LIMIT 1');
PREPARE stmt FROM @statement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @statement = CONCAT('SELECT count(*) into @result2 from ', TableName, ' where Month(date) > Month(Date_SUB(CURRENT_date, Interval 1 month));');
PREPARE stmt FROM @statement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

INSERT INTO email_tracker
(activity_date,  allocated)
Values
(@result, @result2)

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多