mysql-按函数替换所有列值

jtw3ybtb  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(302)

我需要用一个函数修改列中的所有值。我已经编写了一个函数并将其添加到存储函数中。我已经编写了一个存储过程,它将用一个游标循环该列中的所有值并切换这些值。
这是一个运行wamp、PHP5.6、MySQL5.0的windows服务器,也尝试了EC2Linux服务器和MySQL5.6。

DELIMITER $$

    DROP PROCEDURE IF EXISTS `my_proc` $$
    CREATE PROCEDURE `my_proc`() 
    BEGIN

    DECLARE val1 INT DEFAULT NULL;
    DECLARE val2 INT DEFAULT NULL;

    DECLARE done TINYINT DEFAULT FALSE;

    DECLARE cursor1  CURSOR FOR SELECT `col1` FROM  `table1` WHERE 1; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cursor1;

    my_loop: 
    LOOP

      FETCH NEXT FROM cursor1 INTO val1;

      IF done = TRUE THEN 
        LEAVE my_loop; 
      ELSE   
        SET val2 = CALL the_other_procedure1(val1);
        UPDATE  `table1`
            SET `col1` = val2
            WHERE `col1` = val1 ;

      END IF;
    END LOOP my_loop;
    END $$

    DELIMITER ;

在phpmyadmin的sql部分运行它时,我发现了2个错误:在分析过程中发现了1个错误。

Unexpected character. (near ":" at position 364)

以及:


# 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CALL the_other_procedure1(val1);

        UPDATE  `table1`
            SET `col1` = val2
            WHER' at line 25

下面是一个更新的例子,在我们读到的同一个表中。

w6lpcovy

w6lpcovy1#

两句话:
声明 FETCH NEXT FROM cursor1 INTO val1; 应该变得公正 FETCH cursor1 INTO val1; ;

任务 SET val2 = CALL the_other_procedure1(val1); 应在没有关键字的情况下调用 CALL ,即 SET val2 = the_other_procedure1(val1); . 还要确保你 the_other_procedure1() 是一个函数(即它必须返回一些值)。
阅读有关存储过程和函数之间的差异的更多信息。

相关问题