【问题标题】:MySql Stored Procedure -> Variable or condition declaration after cursor or handler declarationMySql 存储过程 -> 游标或处理程序声明后的变量或条件声明
【发布时间】:2019-11-05 16:35:53
【问题描述】:

我尝试创建一个存储过程,但保存时总是出错。我以不同的顺序尝试了声明,但得到了相同的错误,或者工作台关闭时没有错误。

此过程应将不同表中不同字段的 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

谁能帮忙?

非常感谢您的每一个提示;)

【问题讨论】:

    标签: mysql procedure declare


    【解决方案1】:

    开始的几件事:

    1. 最后一个DECLARE 应该是DECLARE cursor_iDECLARE CONTINUE HANDLER(在光标声明之前移动DECLARE done)。
    2. 你需要声明变量cursor_*(其中3个)和idfeld
    3. 您不能从变量中SELECT。您必须为此使用动态 SQL

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2015-01-08
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多