mysql 存储过程入门 博客分类: 数据库操作
程序员文章站
2024-03-18 09:42:46
...
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语句:
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
背景描述:有很应用中会有多张同结构的表,如果单纯的一个创建或是拷贝、粘贴+更改;也可以完成,表多了总是很痛苦,看了网上的资料,自己动手写了一个练习,呵呵跑通了滴;
目前是学会了使用,但部分为何这样用还不是特别懂,先上跑通的例子再说;
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 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
推荐阅读
-
mysql 存储过程入门 博客分类: 数据库操作
-
mysql 存储过程入门 博客分类: 数据库操作
-
mysql存储过程详解 博客分类: 数据库 mysql存储过程
-
MemSQL 入门体验小记 博客分类: 数据-存储-交换 memsqldatabase数据库关系型数据库内存数据库
-
Python --使用sqlalchemy连接、操作MySQL数据库 博客分类: Python学习 PythonSQLAlchemyMySQL
-
mysql存储过程《2》续 博客分类: MySQL mysql存储过程mysql游标mysql循环mysql使用whilemysql使用repeat
-
mysql存储过程《3》 博客分类: MySQL mysql存储过程mysql游标mysql循环mysql动态使用表名mysql预处理PREPARE
-
mysql存储过程《2》 博客分类: MySQL mysql存储过程mysql游标mysql循环
-
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度) 博客分类: 数据库 mysqldatedate_timenowtimestamp
-
sql server、db2、oracle 存储过程动态sql语句示例 博客分类: 程序日志 ORACLE、DB2、SQL Server数据库存储过程动态SQL