【发布时间】:2020-04-12 22:12:06
【问题描述】:
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; /
错误:错误 1064 (42000):您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在 'BEGIN 附近使用的正确语法 声明 vQuarter VARCHAR(6); 声明 vMonth_Name VARCHAR(20); ' 在第 2 行
【问题讨论】:
-
您明确声明了一个函数。它期待在 BEGIN 之前的 RETURN 声明。看看文档:mariadb.com/kb/en/library/create-function
-
你真的需要
CONVERTs吗?数据类型 DATE 和您拥有的字符串应该兼容。 -
而
SET vdate_id = vdate_id + 1;不能与DATE一起使用。而是做SET vdate_id = vdate_id + INTERVAL 1 DAY; -
“time_dim”维度表对于数据仓库来说通常不是一个好主意,至少当您开始使用 dim 表进行查找时(例如 find all “monday " 行)。
-
考虑使用“序列表”;这样可以避开光标等
标签: function mariadb procedure