欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql 存储过程入门 博客分类: 数据库操作  

程序员文章站 2024-03-18 09:37:40
...
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