error: This command is not supported in the prepared statement protocol yet

tiantang_85 2011-03-21 05:23:50
问题描述:想为一组表创建触发器。实现时,创建了一个临时表,用来存储表名,然后循环,为各个表创建触发器。代码如下:
-- 临时表
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
请问下,我哪里出问题了,并且该如何改正,谢谢大家乐。
...全文
1924 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiantang_85 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]
引用哦。这样呀。那对这样要为一批表创建触发器的情况,我要怎么实现呢?有什么好的方法吗?这样,不如在EXCEL中把语句利用公式准备好,然后一次性复制到MYSQL中执行。

当然你也可以写脚本来实现。
[/Quote]

按照大哥的提示,用excel做的(利用excel中的concatenate函数),谢谢了。
tiantang_85 2011-03-22
  • 打赏
  • 举报
回复
我在想是不是我可以直接执行,而不用execute语句。但是如果执行的话,那我的相应的表名怎么用变量传递呢。以drop trigger为例,
我想删除关于表bbbb的触发器
set ?:=concat(' TRIG_FM_',V_TABLE_P,'_INSERT');
drop trigger if exists ?//
问号的位置应该用什么形式代替呢?我尝试了@aa,他会直接报错;变量aa(用之前已声明过),但是他会直接把名为aa的触发器删除,而不是删除变量aa指代的触发器。
这种方法下该怎么操作呢?

我是觉得excel的方法我不懂,不知道如何操作,而且要是逐一写,工作量太大,而且还没必要。所以既然prepare不支持这种创建和删除触发器的语句,那我直接执行它就是了。可是还是行不通。
tiantang_85 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]
引用哦。这样,不如在EXCEL中把语句利用公式准备好,然后一次性复制到MYSQL中执行。

当然你也可以写脚本来实现。
[/Quote]
不太明白什么意思?
不明白“不如在EXCEL中把语句利用公式准备好”是什么意思?事实上,我有十六个表呢。怎么用这种方式实现呢?这种方式更简单,对吧?
如果要是用脚本实现,就必须一个个的创建吗?那也太麻烦了吧?我要为每个表创建三个触发器,然后有十六个表,我怕我脑袋会傻掉。
ACMAIN_CHM 2011-03-21
  • 打赏
  • 举报
回复
[Quote]哦。这样呀。那对这样要为一批表创建触发器的情况,我要怎么实现呢?有什么好的方法吗?[/Quote]这样,不如在EXCEL中把语句利用公式准备好,然后一次性复制到MYSQL中执行。

当然你也可以写脚本来实现。
tiantang_85 2011-03-21
  • 打赏
  • 举报
回复
哦。这样呀。那对这样要为一批表创建触发器的情况,我要怎么实现呢?有什么好的方法吗?
wwwwb 2011-03-21
  • 打赏
  • 举报
回复
不支持动态创建TRIGGER
ACMAIN_CHM 2011-03-21
  • 打赏
  • 举报
回复
PREPARE 中并不是支持所有的语句的。

5.4 中仅以下语句可在PREPARE中使用。

[Quote]
The following SQL statements can be used as prepared statements:

ALTER TABLE
ANALYZE TABLE
CACHE INDEX
CALL
CHANGE MASTER
CHECKSUM {TABLE | TABLES}
COMMIT
{CREATE | DROP} DATABASE
{CREATE | RENAME | DROP} USER
CREATE INDEX
CREATE TABLE
DELETE
DO
DROP INDEX
DROP TABLE
FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES
| LOGS | STATUS | MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES}
GRANT
INSERT
INSTALL PLUGIN
KILL
LOAD INDEX INTO CACHE
OPTIMIZE TABLE
RENAME TABLE
REPAIR TABLE
REPLACE
RESET {MASTER | SLAVE | QUERY CACHE}
REVOKE
SELECT
SET
SHOW BINLOG EVENTS
SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW}
SHOW {AUTHORS | CONTRIBUTORS | WARNINGS | ERRORS}
SHOW {MASTER | BINARY} LOGS
SHOW {MASTER | SLAVE} STATUS
SLAVE {START | STOP}
UNINSTALL PLUGIN
UPDATE


[/Quote]
课程简介: 课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图+实战的方式讲解。 第一部分:彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景和事例来讲解。 第二部分:实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读、MVCC精讲。 第三部分:彻底搞清楚4种事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED 读已提交隔离级别、REPEATABLE_READ 可重复度隔离级别、SERIALIZABLE 序列化隔离级别 第四部分:彻底搞清楚MySQL的各种锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 第五部分:彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIREDPROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVER、PROPAGATION_NESTED分布式事务的理论基础:RPC定理、BASE理论、XA协议都是什么,原理是什么,有什么关联关系 第六部分:分布式事务的5种解决方案原理和优缺点:2PC两阶段提交法、3PC三阶段提交法、TCC事务补偿、异步确保策略、最大努力通知策略 第七部分:阿里巴巴分布式事务框架Seata:历经多年双十一,微服务分布式事务框架,用一个Nacos+Spring Cloud+Seta+MySql的微服务项目,实战讲解阿里的分布式事务技术,深入理解和学习Seata的AT模式、TCC模式、SAGA模式。 课程资料: 课程附带配套2个项目源码72页高清PDF课件一份阿里巴巴seata-1.1.0源码一份阿里巴巴seata-server安装包一份

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧