Хранимая процедура MySql -> Объявление переменной или условия после объявления курсора или обработчика - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь создать хранимую процедуру, но всегда получаю ошибку при сохранении. Я пробовал объявление в разных порядках, но получаю одну и ту же ошибку, или верстак закрывается без ошибок.

Эта процедура должна сохранить datedif из разных полей в разных таблицах в одну таблицу. другая хранимая процедура должна затем записать «фактические» даты в эти поля после восстановления базы данных из резервной копии. это должно быть для демонстрационной базы данных

таблица резервных копий 'datedifs' содержит

'datedifs', 'tabelle', 'varchar(200)'
'datedifs', 'feld', 'varchar(200)'
'datedifs', 'idfeld', 'varchar(200)'
'datedifs', 'idwert', 'varchar(200)'
'datedifs', 'DateDif', 'int(11) unsigned'
'datedifs', 'bemerkung', 'varchar(400)'

, и здесь код

CREATE PROCEDURE `dumpDateDiffs` ()
BEGIN
  DECLARE idFeld VARCHAR(30);
  DECLARE cursor_i CURSOR FOR SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE from information_schema.columns WHERE (Column_Type LIKE '%time%' or Column_Type LIKE '%date%') AND TABLE_SCHEMA = 'pldemo' 
                   AND TABLE_NAME IN ('angebote', 'ansprechpartner', 'benutzer', 'kontaktblog', 'projekte', 'rechnungen','saetzealt','stundenint');
  DECLARE done INT DEFAULT FALSE;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  DELETE FROM datedifs WHERE NOT tabelle IS NULL;
  OPEN cursor_i;
  read_loop: LOOP
    FETCH cursor_i INTO cursor_TABLE_NAME, cursor_COLUMN_NAME, cursor_COLUMN_TYPE;
    IF done THEN
      LEAVE read_loop;
    END IF;
    /**INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);**/
    CASE cursor_TABLE_NAME 
      WHEN 'angebote' then SET idfeld = 'ID_Angebot'; SET idfeld2 = ''; 
      WHEN 'ansprechpartner' then SET idfeld = 'idAnsprechpartner'; 
      WHEN 'benutzer' then SET idfeld = 'uid';
      WHEN 'kontaktblog' then SET idfeld = 'ID'; 
      WHEN 'projekte' then SET idfeld = 'prnum'; 
      WHEN 'rechnungen' then SET idfeld = 'id'; 
      WHEN 'saetzealt' then SET idfeld = 'datedifID'; 
      WHEN 'stundenint' then SET idfeld = 'datedifID'; 
      ELSE  SET idfeld = ''; INSERT INTO datedifs (tabelle, feld, idfeld, idwert, DateDif) VALUES('idFeld-Fehler',  cursor_TABLE_NAME);
    END CASE;    
    IF idfeld <> '' then
       INSERT INTO datedifs (tabelle, feld, idfeld, idwert, DateDif) 
                   SELECT '''' + cursor_TABLE_NAME + '''' as 'tabelle', '''' + cursor_COLUMN_NAME + '''' AS 'feld', '''' + idfeld + '''' as 'idfeld', idfeld as 'idwert', DATEDIFF(NOW(),cursor_COLUMN_NAME) AS 'DateDif'
                   FROM cursor_TABLE_NAME WHERE NOT cursor_COLUMN_NAME IS NULL;
    END IF;
    /**INSERT INTO datedifs (tabelle, feld, idfeld, idwert, DateDif) VALUES(cursor_TABLE_NAME, cursor_COLUMN_NAME, cursor_VAL);**/
    /**INSERT INTO datedifs VALUES(cursor_TABLE_NAME, cursor_COLUMN_NAME, cursor_VAL);**/
  END LOOP;
  CLOSE cursor_i;    
END

может кто-нибудь помочь?

большое спасибо за каждый совет;)

1 Ответ

0 голосов
/ 05 ноября 2019

Пара вещей, с которых нужно начать:

  1. Last DECLARE должны быть DECLARE cursor_i и DECLARE CONTINUE HANDLER (переместите DECLARE done до объявления курсора).
  2. Вам нужно декалировать переменные cursor_* (3 из них) и idfeld
  3. Вы не можете SELECT из переменной. Вы должны использовать динамический SQL для этого
...