function - mariadb fonction, procedure error 你的 SQL 有错误
问题描述
DELIMITER /
CREATE FUNCTION filltimeDim ()
BEGIN
DECLARE vQuarter VARCHAR(6);
DECLARE vMonth_Name VARCHAR(20);
DECLARE vdate_id date;
DECLARE vyear_id CHAR(4);
DECLARE vweekly_Name VARCHAR(20);
DECLARE vMonth_Num TINYINT(10);
DECLARE vweekday_Num TINYINT(10);
BEGIN
SET vdate_id = CONVERT('1998-01-01', DATE);
WHILE (CONVERT('vdate_id' USING utf8) <= '2002-12-31')
LOOP
SET vyear_id = YEAR(vdate_id);
SET vQuarter = QUARTER(vdate_id);
SET vMonth_Name = MONTHNAME(vdate_id);
SET vweekly_Name = DAYOFWEEK(vdate_id);
SET vMonth_Num = MONTH(vdate_id);
SET vweekday_Num = WEEKDAY(vdate_id);
INSERT INTO Time_Dim VALUES
(vdate_id, vyear_id, vquarter, vMonth_Name,vweekly_Name,vMonth_Num,vweekday_Num);
SET vdate_id = vdate_id + 1;
END LOOP;
END;
END; /
错误:ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以获取在 'BEGIN DECLARE vQuarter VARCHAR(6) 附近使用的正确语法;声明 vMonth_Name VARCHAR(20); ' 在第 2 行
解决方案
您可能想要创建存储过程而不是函数。
此外,MariaDB 使用DO
关键字而不是标记循环LOOP
的开始和结束。WHILE
这是成功完成的 SQL 的固定版本:
DELIMITER //
CREATE PROCEDURE filltimeDim ()
BEGIN
DECLARE vQuarter VARCHAR(6);
DECLARE vMonth_Name VARCHAR(20);
DECLARE vdate_id date;
DECLARE vyear_id CHAR(4);
DECLARE vweekly_Name VARCHAR(20);
DECLARE vMonth_Num TINYINT(10);
DECLARE vweekday_Num TINYINT(10);
BEGIN
SET vdate_id = CONVERT('1998-01-01', DATE);
WHILE (CONVERT(vdate_id USING utf8) <= '2002-12-31')
DO
SET vyear_id = YEAR(vdate_id);
SET vQuarter = QUARTER(vdate_id);
SET vMonth_Name = MONTHNAME(vdate_id);
SET vweekly_Name = DAYOFWEEK(vdate_id);
SET vMonth_Num = MONTH(vdate_id);
SET vweekday_Num = WEEKDAY(vdate_id);
INSERT INTO Time_Dim VALUES
(vdate_id, vyear_id, vquarter, vMonth_Name,vweekly_Name,vMonth_Num,vweekday_Num);
SET vdate_id = vdate_id + INTERVAL 1 DAY;
END WHILE;
END;
END; //
请注意,修改后的 SQL 使用日期算术而不是数字算术。这会正确更新日期,而原始日期会导致日期溢出。
推荐阅读
- java - 只是 JTextField 中的数字
- javascript - 如何在同一页面上多次添加相同的轮播?
- python - 错误:包“Unidecode”需要不同的 Python:2.7.18 不在“>=3.5”中
- image - 无论图像大小如何,图像始终只需 5 秒即可加载 (MAMP)
- python - 错误:azure_cosmosdb_container 类型中缺少强制属性值
- c - 为什么包含守卫不需要反斜杠是多行的?
- r - IR,如何自动汇总数字列。谢谢
- kotlin - Kotlin 'where' 关键字与嵌套接口
- php - AJAX - PHP - 上传两个输入文件
- javascript - nodejs Promise.all()在承诺过程后不起作用