当前位置: 首页 > 面试题库 >

将存储过程参数用作DATE_SUB的单位参数

汤博
2023-03-14
问题内容

我想知道是否可以将参数传递给mysql存储过程,并将该参数用作DATE_SUB函数的 单位 参数。看来 unit
参数是一个保留字,所以我不知道unit是否有类型。

我正在尝试做的事例:

DELIMITER $$

DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(param1 unit)
BEGIN

select DATE_SUB(now(), INTERVAL 1 param1);

END $$

DELIMITER ;

UPDATE 1 我尝试使用prepare语句,可以创建存储的proc。

DELIMITER $$

DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(param1 varchar(10))
BEGIN


PREPARE stmt FROM 'SELECT DATE_SUB(now(), INTERVAL 1 ?)';
EXECUTE stmt USING @param1;


END $$

DELIMITER ;

当我执行它时:CALL test(’WEEK’); 您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’?)’附近使用正确的语法


问题答案:

无论有没有预备语句,在存储过程中都无法执行您要执行的操作。

您可以执行类似的操作:

DELIMITER $$

DROP PROCEDURE IF EXISTS test_proc $$
CREATE PROCEDURE  test_proc(param1 varchar(20))
BEGIN

  CASE UPPER(param1)
    WHEN 'MICROSECOND' THEN select DATE_SUB(now(), INTERVAL 1 MICROSECOND); 
    WHEN 'SECOND' THEN select DATE_SUB(now(), INTERVAL 1 SECOND);
    WHEN 'MINUTE' THEN select DATE_SUB(now(), INTERVAL 1 MINUTE);
    WHEN 'HOUR' THEN select DATE_SUB(now(), INTERVAL 1 HOUR);
    WHEN 'DAY' THEN select DATE_SUB(now(), INTERVAL 1 DAY);
    WHEN 'WEEK' THEN select DATE_SUB(now(), INTERVAL 1 WEEK);
    WHEN 'MONTH' THEN select DATE_SUB(now(), INTERVAL 1 MONTH);
    WHEN 'QUARTER' THEN select DATE_SUB(now(), INTERVAL 1 QUARTER);
    WHEN 'YEAR' THEN select DATE_SUB(now(), INTERVAL 1 YEAR);
    ELSE select 'UNEXPECTED UNIT';
  END CASE;

END $$

DELIMITER ;


 类似资料:
  • 问题内容: 我有大约六种通用但相当复杂的存储过程和函数,我想以一种更通用的方式使用它们。 理想情况下,我希望能够将表名作为参数传递给过程,因为当前它是硬编码的。 我所做的研究表明,我需要将过程中所有现有的SQL转换为使用动态SQL,以便从参数中拼接动态表名称,但是我想知道是否还有一种更简便的方法可以通过另一种方式引用该表? 例如: 如果是这样,如何从表名设置@MyTable变量? 我正在使用SQL

  • 我正在开发一个框架,其中我是一个使用动态创建的参数调用存储过程。我正在运行时构建参数集合。 当我将参数传递给存储过程时,会出现此问题,但存储过程不接受此类参数。 例如,我的存储过程是: 调用存储过程: 这会引发以下错误: 这在 Sybase ASE 中工作正常,它只是忽略任何其他参数。这可以通过MSSQL服务器2008实现吗?任何帮助,非常感谢。谢谢

  • 问题内容: 我使用以下SP来对新闻文章列表进行分页。您可能会猜到,是要返回的行数,是从中选择行的索引(按内部查询排序),指示要排序的列,并指示是否对一个方向或另一个方向进行排序。在添加参数之前,我的原始查询在 这里。 现在,实际上没有任何问题,但是参数不起作用。如果提供1作为参数,它将为我提供与提供2作为该参数完全相同的结果。 问题答案: 行号不会在每一行上求值,但是case语句是有效的,因此无论

  • 问题内容: 我有一个带有以下参数的T-SQL存储过程 我想知道是否可以通过as参数传递结果: 我尝试了类似的方法,但是它不起作用。 问题答案: 您在示例中编写的SELECT查询可能会带回多行(您的SELECT不具有WHERE子句或TOP(n))。如果您打算让过程使用一组“表格”参数,那么从SQL Server 2008开始,您可以使用表值参数。 这涉及到创建用户定义的表表,这无疑将意味着调整存储过

  • 问题内容: 我有一个来自此(google book )的mysql存储过程,一个例子是这样的: 该程序编译正常。(我在ubuntu中使用MySQL查询浏览器)。 但是,当我调用该过程时: (也在查询浏览器中) 它返回一个错误: 为什么这个例子不起作用? 问题答案: 无法复制。对我来说效果很好: 也许您应该粘贴整个错误消息,而不是对其进行汇总。

  • 问题内容: 我在我的应用程序中收到一个错误,我不知道如何解决它。这是代码: 我收到的错误是与。它说 InvalidCastException无法将参数值从任务转换为字符串。 我认为这与我尝试放置位置有关(在if语句内部),但我不确定。任何帮助将非常感激。 谢谢, 马特 问题答案: 我的猜测是 t不是字符串吗?