mysql存储过程中用变量做表名.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

niupai11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档