如何执行字串中的SQL语句

gungod 2011-04-13 10:25:18
如何执行字串中的SQL语句,假设如下:
DECLARE strsql varchar(256);
DECLARE tablename varchar(32);
set tablename = '`test`.tb1';
set strsql = CONCAT('delete from ', tablename );
execute strsql;

上面的写法到execute strsql;这一步就出错了,
该如何实现?
...全文
161 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gungod 2011-04-15
  • 打赏
  • 举报
回复
先结贴,我再开帖,大家继续讨论。
gungod 2011-04-14
  • 打赏
  • 举报
回复
这个语句我写在了1个存储过程中,创建通过了,
但执行的时候就不行了,稍后我整理下贴出。
gungod 2011-04-13
  • 打赏
  • 举报
回复
我现在这个语句是写到存储过程中的,
等我写完编译下,看能不能执行成功。
WWWWA 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gungod 的回复:]
引用 5 楼 rucypli 的回复:
DECLARE tablename varchar(32);
set tablename = '`test`.tb1';
set @strsql = CONCAT('delete from ', tablename );
prepare stmt from @strsql;
execute stmt;
deallocate prepare stm……
[/Quote]
语法要求
ACMAIN_CHM 2011-04-13
  • 打赏
  • 举报
回复
[Quote]预制语句的SQL语法不能被用于带嵌套的风格中。也就是说,被传递给PREPARE的语句本身不能是一个PREPARE, EXECUTE或DEALLOCATE PREPARE语句。

我的语句使用了游标读取tablename后再删除表数据的。。。[/Quote]需求比较奇怪。没碰到过这种用法。
gungod 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rucypli 的回复:]
DECLARE tablename varchar(32);
set tablename = '`test`.tb1';
set @strsql = CONCAT('delete from ', tablename );
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
[/Quote]
奇怪为什么你这样写就通过了?

只能
prepare stmt from @strsql;
不能
prepare stmt from strsql;
写。。。
rucypli 2011-04-13
  • 打赏
  • 举报
回复
DECLARE tablename varchar(32);
set tablename = '`test`.tb1';
set @strsql = CONCAT('delete from ', tablename );
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
gungod 2011-04-13
  • 打赏
  • 举报
回复
郁闷!

预制语句的SQL语法不能被用于带嵌套的风格中。也就是说,被传递给PREPARE的语句本身不能是一个PREPARE, EXECUTE或DEALLOCATE PREPARE语句。

我的语句使用了游标读取tablename后再删除表数据的。。。
jguon 2011-04-13
  • 打赏
  • 举报
回复
DELIMITER $$

USE `hzyl`$$

DROP PROCEDURE IF EXISTS `test`$$

CREATE DEFINER=`root`@`%` PROCEDURE `test`()
BEGIN

DECLARE tablename VARCHAR(32);
SET tablename = '`test`.tb1';
SET @strsql = CONCAT('select * from ', tablename );

PREPARE sqlstmt FROM @strsql;
EXECUTE sqlstmt;
DEALLOCATE PREPARE sqlstmt;

END$$

DELIMITER ;
这样可以
WWWWA 2011-04-13
  • 打赏
  • 举报
回复
DECLARE strsql varchar(256);
DECLARE tablename varchar(32);
set tablename = '`test`.tb1';
set @strsql = CONCAT('delete from ', tablename );

PREPARE stmt1 FROM @strsql;
EXECUTE stmt1
DEALLOCATE PREPARE stmt1;
ACMAIN_CHM 2011-04-13
  • 打赏
  • 举报
回复
PREPARE stmt1 FROM strsql;
EXECUTE stmt1
DEALLOCATE PREPARE stmt1;




手册中的例子如下。
[Quote]mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
| 5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;

[/Quote]

56,677

社区成员

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

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