首页 > 解决方案 > 在 MySql 中将随机数据插入到表中

问题描述

有人可以帮我吗?我不知道这里有什么问题

DROP PROCEDURE IF EXISTS insertRandom;
CREATE PROCEDURE insertRandom()
BEGIN
DECLARE mytime timestamp;

    SET mytime := '2009-01-01 00:00:00'
BEGIN
 test_loop : LOOP
    while mytime < now()
        mytime = mytime + interval '8 hours';
        insert into tempdata(temp_val, datum) values((select random()*(110)-10), mytime);
  END LOOP; 
END;

CALL insertRandom;

SELECT * FROM `temp_table`;

错误截图在这里

标签: mysqlsqlstored-procedures

解决方案


看起来程序主体中的分号正在终止语句。我们需要 MySQL 将其CREATE PROCEDURE视为单个语句,但 MySQL 将语句截断,当它看到分号时会看到完整的语句。

MySQL 中默认的语句分隔符是分号;字符。可以覆盖默认分隔符;我们随着DELIMITER声明而改变。

此处临时将语句分隔符修改为两个美元符号字符的示例$$。在过程主体中,分号字符的出现不会终止语句...... MySQL 将继续读取,直到找到两个美元符号字符。(不用说程序主体不应该包含$$

DELIMITER $$ 

DROP PROCEDURE IF EXISTS insertRandom $$

CREATE PROCEDURE insertRandom()
  ...
  ...
  ...
END$$

DELIMITER ;

CALL insertRandom();

请注意,我们使用该DELIMITER语句将分隔符改回分号字符。我没有检查程序的主体是否有其他语法错误;但有些事情很突出。例如,这看起来是错误的

mytime = mytime + interval '8 hours'; 

那可能应该是SET语句,语法是这样的:

SET mytime = mytime + INTERVAL 8 HOUR;

SET语句中,我们可以使用:=in 代替=作为赋值运算符,所以等价

SET mytime := mytime + INTERVAL 8 HOUR;

对于 MySQL 存储程序的循环,我们可以做一个LOOP ... END LOOP并包含一个LEAVE语句,或者我们可以使用一个WHILE循环,或者......

此处记录的语法:

https://dev.mysql.com/doc/refman/5.7/en/while.html

https://dev.mysql.com/doc/refman/5.7/en/loop.html


推荐阅读