MariaDB pl / sql для заполнения таблицы датами от '1990-01-01' до '2000-12-31'

Я пытаюсь создать процедуру или функцию для заполнения имени таблицы Time_Dim в MariaDB.

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, чтобы найти правильный синтаксис для использования рядом с 'LOOP SET vyear_id = YEAR (vdate_id); УСТАНОВИТЕ vQuarter = QUA 'в строке 13


person comocoder    schedule 20.12.2019    source источник
comment
Вы проверили руководство? Потому что буквально в этом то, что не так.   -  person Wesley De Keirsmaeker    schedule 20.12.2019
comment
PL / SQL - это название языка программирования Oracle для работы с базами данных. Я так понимаю, что MariaDB имеет режим совместимости с Oracle, но приведенный выше код не является PL / SQL.   -  person William Robertson    schedule 20.12.2019
comment
Отвечает ли это на ваш вопрос? mariadb fonction, ошибка процедуры У вас есть ошибка в ваш SQL   -  person markusjm    schedule 21.12.2019
comment
Уильям Робертсон: Вы правы, а как мы называем язык программирования баз данных Марии? Да, markusjm, он отвечает на мой вопрос.   -  person comocoder    schedule 22.12.2019


Ответы (2)


Синтаксис для while в MariaDB:

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

https://mariadb.com/kb/en/library/while/

Вы не должны использовать ключевые слова "LOOP"

person Wesley De Keirsmaeker    schedule 20.12.2019

Вы можете использовать механизм хранения последовательностей:

-- SELECT
  -- DATEDIFF('2002-12-31', '1990-01-01'); -- 4747

INSERT INTO `Time_Dim` (
  `vdate_id`,
  `vyear_id`,
  `vquarter`,
  `vMonth_Name`,
  `vweekly_Name`,
  `vMonth_Num`,
  `vweekday_Num`
)
SELECT
  `der`.`day`,
  YEAR(`der`.`day`),
  QUARTER(`der`.`day`),
  MONTHNAME(`der`.`day`),
  DAYOFWEEK(`der`.`day`),
  MONTH(`der`.`day`),
  WEEKDAY(`der`.`day`)
FROM (
  SELECT
    '1990-01-01' + INTERVAL (`seq`) DAY `day`
  FROM
    `seq_0_to_4747`
) `der`;

См. dbfiddle.

person wchiquito    schedule 24.12.2019