【问题标题】:mysql procedure: how can i use table name variablesmysql 程序:如何使用表名变量
【发布时间】:2016-02-11 09:08:53
【问题描述】:

我已经建立了一个 MySQL 程序。 我必须在过程中定义 v_table 变量

谁能帮帮我?
谢谢 保罗

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    open cur1;
     igmLoop: loop
        fetch cur1 into v_column,v_table;
         IF done THEN
          LEAVE igmLoop;
        END IF;
    update v_table set v_column=replace(v_column,'à','a`');
     end loop igmLoop;
    close cur1;
end

【问题讨论】:

    标签: mysql variables store


    【解决方案1】:

    在存储过程中,表名和列名都不能是动态的。您需要将 sql 语句组装为字符串并使用PREPARE, EXECUTE, DEALLICATE PREPARE 语句执行它。因此,基本上,您将从查询中创建一个准备好的语句并执行它。

    链接的文档也包含示例。

    【讨论】:

    • 是的,你可以。但是,如果您计划每次迭代执行更新,请确保调用所有 3 个命令,包括迭代中的 deallocate prepare,否则 mysql 可能会达到可配置的准备语句限制。
    • 为 SELECT concat(' update ', table_name, ' set ',column_name,'=replace(',column_name,','''','''')') 声明 cur1 游标sq FROM information_schema.COLUMNS C WHERE TABLE_SCHEMA = 'splotdb' AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar') ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;set sq='';打开cur1; igmLoop:循环获取cur1到sq;如果完成,则离开 igmLoop;万一;从 sq 准备 stmt;执行语句; DEALLOCATE PREPARE stmt;结束循环 igmLoop;关闭cur1;结束
    • 1.这是不可读的,编辑您的问题并将格式化的代码放在那里。 2. 请提供准确的错误信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2011-11-21
    相关资源
    最近更新 更多