【问题标题】:How to Execute Dynamic Sql String as a Query in mysql server?如何在 mysql 服务器中执行动态 Sql 字符串作为查询?
【发布时间】:2018-11-07 21:29:52
【问题描述】:

我创建了一个触发器,它创建一个动态查询。并执行它我曾尝试过“EXECU q”,但它不起作用。我如何运行/执行该动态查询。

BEGIN
    DECLARE a INT Default 0 ;
    DECLARE str  VARCHAR(255);
    DECLARE q VARCHAR(500);

    SET q = 'insert into '+new.master_name+' values(';

    simple_loop: LOOP
        SET a=a+1; 
        SET str = SPLIT_STRING(new.remarks,"|",a); 
        SET q = CONCAT(q,str+',');
        SET q = LEFT(q, LENGTH(q) - 1);
        IF str='' THEN
                LEAVE simple_loop; 
            END IF;


    END LOOP simple_loop; 
    SET q = CONCATE(q,');');

    EXEC q
END

这是触发器 这是我制作的功能 退货换货( 子串( SUBSTRING_INDEX(str , delim , pos) , CHAR_LENGTH( SUBSTRING_INDEX(str , delim , pos - 1) ) + 1 ) , 脱脂, '' )

【问题讨论】:

  • 使用准备语句
  • 你应该添加 split_string 函数(我认为这不起作用)
  • 我有我自己做的添加功能
  • 这行不通 动态 sql 在触发器或存储函数中是不允许的。
  • if 的选项是什么

标签: mysql sql database mysql-workbench database-trigger


【解决方案1】:

我编写了一个存储过程来执行动态构造的 sql 语句。

用法

SET @index := 7;
CALL eval(CONCAT('SELECT ', @index));

实施

DELIMITER $$

CREATE PROCEDURE eval(IN dynamic_statement TEXT)
  BEGIN
      SET @dynamic_statement := dynamic_statement;
      PREPARE prepared_statement FROM @dynamic_statement;
      EXECUTE prepared_statement;
      DEALLOCATE PREPARE prepared_statement;
  END$$

DELIMITER ;

【讨论】:

    【解决方案2】:

    据我了解,您必须首先从您的字符串中制作一个准备好的语句才能执行它。所以下面的部分代码应该可以代替EXEC q

    PREPARE thequery FROM q;
    EXECUTE thequery;
    

    【讨论】:

    • 我也试过这个,但它不起作用。在 PREPARE thequery FROM q 处给出错误;
    【解决方案3】:

    使用prepare语句来执行你的动态查询

    BEGIN
        DECLARE a INT Default 0 ;
        DECLARE str  VARCHAR(255);
        DECLARE q VARCHAR(500);
        DECLARE q1 VARCHAR(500);
        DECLARE q2 VARCHAR(500);
    
        SET @q = 'insert into '+new.master_name+' values(';
    
        simple_loop: LOOP
            SET a=a+1; 
            SET str = SPLIT_STRING(new.remarks,"|",a); 
            SET q = CONCAT(@q,str+',');
            SET q1 = LEFT(q, LENGTH(q) - 1);
            IF str='' THEN
                    LEAVE simple_loop; 
                END IF;
    
    
        END LOOP simple_loop; 
    
        SET q2 = CONCATE(q1,');');
        PREPARE stmt FROM q2;
        EXECecute stmt;
        deallocate PREPARE stmt;
    END
    

    【讨论】:

    • 动态 sql 是否在触发器或存储生产者中工作?
    • 我已经做出了改变……试试看
    • 仍然不允许在 PREPARE stmt FRom q2 行
    • @符号是什么意思?当我们使用它时
    猜你喜欢
    • 2017-03-29
    • 2011-04-15
    • 2019-11-26
    • 1970-01-01
    • 2017-01-12
    • 2020-03-17
    • 2012-12-06
    • 2015-02-07
    相关资源
    最近更新 更多