Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mysql服务器中执行动态Sql字符串作为查询?_Mysql_Sql_Database_Mysql Workbench_Database Trigger - Fatal编程技术网

如何在mysql服务器中执行动态Sql字符串作为查询?

如何在mysql服务器中执行动态Sql字符串作为查询?,mysql,sql,database,mysql-workbench,database-trigger,Mysql,Sql,Database,Mysql Workbench,Database Trigger,我已经创建了一个触发器,它是创建一个动态查询,并执行它。我已经尝试了“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

我已经创建了一个触发器,它是创建一个动态查询,并执行它。我已经尝试了“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
这是特里格尔 这是我做的函数 返回替换 子串 子字符串_INDEXstr,delim,pos, 字符长度 子串索引TR,delim,位置-1 + 1 , 德利姆,

据我所知,要执行它,您必须首先从字符串中准备好语句。因此,以下部分代码应该可以替代just EXEC q:


据我所知,为了执行它,您必须首先从字符串中生成一个准备好的语句。因此,以下部分代码应该可以替代just EXEC q:


使用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

使用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语句

用法 实施
我已经编写了一个存储过程来执行动态构造的sql语句

用法 实施

使用prepare语句您应该添加split_string函数,我认为它不起作用。我有add函数,我制作了该函数。触发器或存储函数中不允许使用动态sql。如果使用prepare语句,您应该添加split_string函数,我认为它不起作用。如果使用prepare语句,您应该添加split_string函数,我认为它不起作用madeThat's not work触发器或存储函数中不允许使用动态sql。ifi的选项也尝试了这一点,但它不起作用。从q准备查询时出错;我也试过这个,但不起作用。从q准备查询时出错;动态sql在触发器或存储生成器中工作吗?我已经做了更改…尝试它们仍然不允许在Q2中的PREPARE stmt行使用@notation的含义是什么?当我们使用它时,动态sql是否在触发器或存储生产者中工作?我已经做了更改…尝试它们仍然不允许在第2行准备stmt@符号的含义是什么?当我们使用它的时候
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 ;