【问题标题】:why does the in paratemers can not be used in PREPARE statement为什么 in 参数不能在 PREPARE 语句中使用
【发布时间】:2018-04-05 02:44:24
【问题描述】:

我正在学习mysql。这是我练习存储过程的代码。

CREATE DEFINER=`raxuser`@`%` PROCEDURE `test`(in fc_frm_date char(5), in fc_to_date char(5))
BEGIN
declare frm_date char(5);
declare to_date char(5);

select fc_frm_date into @frm_date;
select fc_to_date into @to_date;

select distinct @frm_date, @to_date, fc_frm_date, fc_to_date;

set @s = CONCAT('select distinct @frm_date, @to_date, fc_frm_date, fc_to_date;');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
END

当我运行它时,第一个选择查询正确,而第二个显示错误代码为

错误代码:1054 Unknown column 'fc_frm_date' in 'field list'

我认为这两个选择查询应该相等但不相等。谁能帮忙解释一下?

非常感谢。

【问题讨论】:

  • 第一个SELECT 是一个内嵌SQL 语句,其中嵌入了用户定义的变量和参数。当语句执行时,变量和参数被它们的值替换。第二个是一个字符串,它被转换为带有PREPARE 的SQL 语句。准备好的语句没有“传递给”它的参数,因此会发生错误。我不是 mysql 内部的专家,但这可能是因为 EXECUTE 可以在不同的上下文中。

标签: mysql sql stored-procedures prepared-statement


【解决方案1】:

我认为正确的做法(未测试)是:

set @s = CONCAT('select distinct ? , ? , ? , ?;');
PREPARE stmt FROM @s; 
EXECUTE stmt USING @frm_date, @to_date, fc_frm_date, fc_to_date; 
DEALLOCATE PREPARE stmt;

【讨论】:

  • 作为fc_frm_date不起作用,使用后fc_to_date不能放。
  • 所以将任何参数值放入变量中(你已经在这样做了,是的)。
【解决方案2】:

试试看:

CREATE DEFINER=`raxuser`@`%` PROCEDURE `test`(fc_frm_date char(5), fc_to_date char(5))
BEGIN
DECLARE frm_date CHAR(5);
DECLARE to_date CHAR(5);

SELECT fc_frm_date INTO @frm_date;
SELECT fc_to_date INTO @to_date;
SELECT fc_frm_date INTO @fc_frm_date;
SELECT fc_to_date INTO @fc_to_date;

SET @s = 'select distinct @frm_date, @to_date, @fc_frm_date, @fc_to_date';
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SELECT @s;
END

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 2011-01-26
    • 1970-01-01
    • 2020-11-01
    • 2014-02-27
    • 1970-01-01
    • 2019-09-14
    • 2023-03-26
    • 2010-11-16
    相关资源
    最近更新 更多