【问题标题】:mariadb fonction, procedure error You have an error in your SQLmariadb fonction, procedure error 你的 SQL 有错误
【发布时间】: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


【解决方案1】:

您可能想要创建 stored procedure 而不是函数。

此外,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 使用日期算术而不是数字算术。这会正确更新日期,而原始日期会导致日期溢出。

【讨论】:

  • 谢谢!哎呀!我来晚了。无论如何,在花了一些时间在 MariaDB 文档上之后,我设法做到了并使它工作,是的,我需要一个程序。我不太懂日期算术和数值算术?
  • 如果你使用日期作为数据类型,你必须用+ INTERVAL 1 DAY递增它们,否则你会得到错误。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2017-05-14
  • 2022-12-02
  • 1970-01-01
相关资源
最近更新 更多