`
ohfanfan
  • 浏览: 51337 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

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语句:
SET @update_stmt=''  /*在单引号中间填入要执行的sql语句*/
PREPARE stmt FROM @update_stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;



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可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须表现为一个单一的SQL语句,而不是多个语句。在这语句里,‘?’字符可以被用于标识参数,当执行时,以指示数据值绑定到查询后。‘?’字符不应加引号,即使你想要把它们与字符串值结合在一起。参数标记只能用于数据值应该出现的地方,而不是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



 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics