问题描述:想为一组表创建触发器。实现时,创建了一个临时表,用来存储表名,然后循环,为各个表创建触发器。代码如下:
--  临时表
CREATE TEMPORARY TABLE TABLIST (
   ID INT NOT NULL AUTO_INCREMENT,
   V_TABLE VARCHAR(128),
   PRIMARY KEY(ID));
--  创建触发器DROP PROCEDURE IF EXISTS TEXT_MODLOG_CreateTriggers //
CREATE PROCEDURE TEXT_MODLOG_CreateTriggers()
TEXT_MODLOG_CreateTriggers:BEGIN
       DECLARE V_TABLE_P VARCHAR(128);
       DECLARE v_num INT;             
       DECLARE p INT DEFAULT 0;  
       DECLARE V_TABLEname varchar(32);   
 
       INSERT INTO TABLIST(V_TABLE) VALUES ('aaaa');
       INSERT INTO TABLIST(V_TABLE) VALUES ('bbbb');       select count(*) into v_num from TABLIST;
       tt:LOOP
           SET p =p +1;
           select V_TABLE into V_TABLE_P from TABLIST where id=p;
           set V_TABLEname := CONCAT( V_TABLE_P , '_MODLOG');
           
       --  trigger after insert
        SET @V_SQL := CONCAT('drop trigger if exists TRIG_FM_',V_TABLE_P,'_INSERT');
        PREPARE stmt FROM @V_SQL;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @V_SQL := CONCAT('create trigger TRIG_FM_' , V_TABLE_P ,'_INSERT', ' 
                after insert on ' , V_TABLE_P , ' 
                for each row
                  call TEXT_modlog_addorupdate(V_TABLEname, NEW.id, NEW.dbid, 0);   ');
       PREPARE stmt FROM @V_SQL;
       EXECUTE stmt;
       DEALLOCATE PREPARE stmt;       IF p < LAST_INSERT_ID() THEN ITERATE tt ; END IF;
          LEAVE tt;
       END LOOP tt;  
end TEXT_MODLOG_CreateTriggers;
//-- 调用存储过程创建触发器
call TEXT_MODLOG_CreateTriggers();
//运行结果是:
存储过程创建成功,但是调用时,出现如下的错误:
ERROR 1295 (HY000): This command is not supported in the prepared statement protocol yet
请问下,我哪里出问题了,并且该如何改正,谢谢大家乐。

解决方案 »

  1.   

    PREPARE 中并不是支持所有的语句的。5.4 中仅以下语句可在PREPARE中使用。
      

  2.   

    这样,不如在EXCEL中把语句利用公式准备好,然后一次性复制到MYSQL中执行。当然你也可以写脚本来实现。
      

  3.   

    不太明白什么意思?
    不明白“不如在EXCEL中把语句利用公式准备好”是什么意思?事实上,我有十六个表呢。怎么用这种方式实现呢?这种方式更简单,对吧?
    如果要是用脚本实现,就必须一个个的创建吗?那也太麻烦了吧?我要为每个表创建三个触发器,然后有十六个表,我怕我脑袋会傻掉。
      

  4.   

    我在想是不是我可以直接执行,而不用execute语句。但是如果执行的话,那我的相应的表名怎么用变量传递呢。以drop trigger为例,
    我想删除关于表bbbb的触发器 
    set ?:=concat(' TRIG_FM_',V_TABLE_P,'_INSERT');
    drop trigger if exists ?//
    问号的位置应该用什么形式代替呢?我尝试了@aa,他会直接报错;变量aa(用之前已声明过),但是他会直接把名为aa的触发器删除,而不是删除变量aa指代的触发器。
    这种方法下该怎么操作呢?我是觉得excel的方法我不懂,不知道如何操作,而且要是逐一写,工作量太大,而且还没必要。所以既然prepare不支持这种创建和删除触发器的语句,那我直接执行它就是了。可是还是行不通。
      

  5.   


    按照大哥的提示,用excel做的(利用excel中的concatenate函数),谢谢了。