- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
mysql存储过程中用变量做表名
1.用变量做表名: 简单的用 set 或者 declare 语句定义变量,然后直接作为 sql 的表名是不行的, mysql 会把变 量名当作表名。 在其他的 sql 数据库中也是如此, mysql 的解决方法是将整条 sql 语句作为变 量,其中穿插变量作为表名,然后用 sp_executesql 调用该语句。
这在 mysql5.0 之前是不行的, 5.0 之后引入了一个全新的语句,可以达到类似 sp_executesql 的功能(仅对 procedure 有效, function 不支持动态查询) :
PREPARE stmt_name FROM preparable_stmt;
EXECUTE stmt_name [USING @var_name [, @var_name] ...]; {DEALLOCATE | DROP} PREPARE stmt_name;
为了有一个感性的认识,
下面先给几个小例子: 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;
TOC \o 1-5 \h \z + +
| hypotenuse |
+ +
| 5 |
+ +
mysql DEALLOCATE PREPARE stmt1;
mysql SET @s = SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse;
mysql PREPARE stmt2 FROM @s;
mysql SET @a = 6;
mysql SET @b = 8;
mysql EXECUTE stmt2 USING @a, @b;
TOC \o 1-5 \h \z + +
| hypotenuse |
+ +
| 10 |
+ +
mysql DEALLOCATE PREPARE stmt2;
如果你的 MySQL 版本是 5.0.7 或者更高的, 你还可以在 LIMIT 子句中使用它, 示例如下:
mysql SET @a=1;mysql PREPARE STMT FROM SELECT * FROM tbl LIMIT ?;
mysql EXECUTE STMT USING @a;
mysql SET @skip=1; SET @numrows=5;
mysql PREPARE STMT FROM SELECT * FROM tbl LIMIT ?, ?; mysql EXECUTE STMT USING @skip, @num rows;
使用PREPARE的几个注意点:
A: PREPAREstmt_name FROM preparable_stmt;预定义一个语句,并将它赋给 stmt_name
stmt_ name是不区分大小写的。
B:即使preparable_stmt语句中的?所代表的是一个字符串,你也不需要将 ?用引号包
含起来。
C:如果新的PREPARE语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放!
即使这个新的 PREPARE语句因为错误而不能被正确执行。
D:
PREPARE stmt_ name的作用域是当前客户端连接会话可见。
E:
要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPAR句法。
F:
EXECUTE stmt_name句法中,如果 stmt_name不存在,将会引发一个错误。
G:
如果在终止客户端连接会话时, 没有显式地调用 DEALLOCATE PREPAR句法释放资源,
服务器端会自己动释放它。
H: 在预定义语句中, CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, l和大ATE, 部分的SHOW句法被支持。
I: PREPARE语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13开始,它可以被 用于存储过程,仍不支持在函数中使用!
下面给个示例:
Java代码海
CREATE PROCEDURE p1(IN id INT UNSIGNED,IN n ame VARCHAR(11))
BEGIN lable_exit:
BEGIN
SET @SqlCmd = SELECT * FROM tA ;
IF id IS NOT NULL THEN SET @SqlCmd = CONCAT(@SqlCmd , WHERE id=?);
PREPARE stmt FROM @SqlCmd
文档评论(0)