mysql 存储过程入门

mysql 存储过程入门练习——循环创建相同结构的表

背景描述:有很应用中会有多张同结构的表,如果单纯的一个创建或是拷贝、粘贴+更改;也可以完成,表多了总是很痛苦,看了网上的资料,自己动手写了一个练习,呵呵跑通了滴;

目前是学会了使用,但部分为何这样用还不是特别懂,先上跑通的例子再说;


PART1:如何循环创建相同结构的表
mysql> use procduretest
Database changed

mysql> show tables;
-> //;
+------------------------+
| Tables_in_procduretest |
+------------------------+
| cf_file_1 |
| cf_file_2 |
| cf_file_3 |
| cf_file_4 |
| cf_file_5 |
| test_file |
+------------------------+
6 rows in set (0.00 sec)


mysql> delimiter //
mysql> create procedure test1()
-> begin
-> declare aa varchar(256);
-> declare bb varchar(256);
-> declare i int default 1;
-> declare count int default 5;
-> while i<=5 do
-> set aa=CONCAT('cf_file22_',i);
-> set @tfile= CONCAT(' create table ',aa ,' like

-> prepare stmt from @tfile;
-> execute stmt;
-> set i=i+1;
-> end while;
->
-> while i<=5 do
-> set bb=CONCAT('cf_folder_',i);
-> set @tfolder= CONCAT(' create table ',aa ,' li

-> prepare stmt from @tfolder;
-> execute stmt;
-> set i=i+1;
-> end while;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)


mysql> call test1()//;
Query OK, 0 rows affected (0.20 sec)


mysql> show tables;
-> //
+------------------------+
| Tables_in_procduretest |
+------------------------+
| cf_file22_1 |
| cf_file22_2 |
| cf_file22_3 |
| cf_file22_4 |
| cf_file22_5 |
| cf_file2_1 |
| cf_file_1 |
| cf_file_2 |
| cf_file_3 |
| cf_file_4 |
| cf_file_5 |
| test_file |
+------------------------+
12 rows in set (0.00 sec)

mysql>


PART2:为何要这么用呢?


1、为何要将全sql作为变量?
答:
用变量做表名,如果简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,


2、如何在存储过程中执行sql语句:
[align=center]SET @update_stmt='' /*在单引号中间填入要执行的sql语句*/
PREPARE stmt FROM @update_stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;[/align]


PREPARE是mysql的预处理语句,基本语法如下:
MySQL prepare语法:

PREPARE statement_name FROM preparable_SQL_statement; /*定义*/

EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/

{DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;

PREPARE语句用于预备一个语句,并指定名称statement_name,以后引用该语句。语句名称对大小写不敏感。
preparable_SQL_statement可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。[color=blue]该文本必须表现为一个单一的SQL语句,而不是多个语句[/color]。在这语句里,‘?’字符可以被用于标识参数,当执行时,以指示数据值绑定到查询后。‘?’字符不应加引号,即使你想要把它们与字符串值结合在一起。参数标记只能用于数据值应该出现的地方,而不是SQL关键字,标识符,等等。

如果预语句已经存在,则在新的预语句被定义前,它会被隐含地删掉。

举个PREPARE直接跟sql语句的例子:
mysql> prepare md5sum from 'select md5(?) AS md5sum';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> set @a=111;
Query OK, 0 rows affected (0.00 sec)

mysql> set @b=222;
Query OK, 0 rows affected (0.00 sec)

mysql> execute md5sum using @a;

3、为何prepare中用到的sql语句必须是用户变量呢?
如果将以上存储过程中的@tfile改为aa则会出错? 学习中,暂时无解;
附:mysql变量详解 http://hi.baidu.com/%CA%E6%B7%F4%BC%D1%B2%C5%CA%C7%CD%F5%B5%C0/blog/item/65b93f359efbe9afd1a2d3f5.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值