mysql初识(二)

八、存储过程

mysql在5.0版本后提供了存储过程和函数。

语法与oracle不同在于:
1)指定参数是输入、输出、输入输出的参数(in、out、 in out)放在参数名前面。
2)以begin开始,以end结束语句块。声明在begin之后。
3)用delimiter关键字来改变语句结束的标志。(默认是分号,若不修改的话,会将存储过

程当做单条语句处理,并报错)
4)可以进行dml操作


如:
mysql> delimiter //
mysql> create procedure proc_name(in cc integer)
    -> begin
    -> declare v varchar(20);
    -> if cc=1 then
    -> set v='mysql';
    -> else
    -> set v='php';
    -> end if;
    -> insert into tb(name) values(v);
    -> end;
    -> //
Query OK, 0 rows affected (0.03 sec)

执行结束后需要将语句结束符改回成分号:
mysql> delimiter ;

存储过程的调用方式为:call sp_name(parameter……);
函数的调用方式为: select function_name(……);


进行创建表操作的例子:
mysql> create procedure p_test()
    -> begin
    ->   create table tt(t_name varchar(2));
    -> end;
    -> //
Query OK, 0 rows affected (0.02 sec)

mysql> call p_test();
    -> //
Query OK, 0 rows affected (0.14 sec)

mysql> show tables;
    -> //
+----------------+
| Tables_in_test |
+----------------+
| t              |
| tb             |
| tt             |
+----------------+
3 rows in set (0.00 sec)

 

创建函数:--注意是returns,不是return
mysql> create function f_name(t_n int)
    -> returns varchar(20)
    -> begin
    -> return(select t_name from tt where t_name=t_n);
    -> end;
    -> //
Query OK, 0 rows affected (0.00 sec)


存储过程中的变量:
mysql存储过程中声明的变量分为局部变量和全局变量两种。
局部变量作用域只在其声明所在的程序块或子块中。
全局变量又叫做会话变量,在存储过程中有效。以@作为起始符号。
定义变量的语句是declare variable_name1,variable_name2…… type default xxxx;
不设置默认值时默认是NULL。

为变量赋值
方法1:set variable_name=xxxx,variable_name2=xxxx……;
方法2:select xxx into variable_name from table_name ……;
两种方式都可以同时为多个变量赋值。

mysql中游标的使用方法和oracle显式游标使用方法类似,但声明不太一样。

create procedure p_test2(out var_out varchar)
begin
declare c_a cursor for select t_name from tt;
declare var_a varchar(20) default 'NO_RECORD';
open c_a;
fetch c_a into var_a;
set var_out=var_a;
close c_a;
end;
//
以上语句执行报错,不太明白。

mysql> create procedure p_test2(out var_out varchar)
    -> begin
    -> declare c_a cursor for select t_name from tt;
    -> declare var_a varchar(20) default 'NO_RECORD';
    -> open c_a;
    -> fetch c_a into var_a;
    -> set var_out=var_a;
    -> close c_a;
    -> end;
    -> //
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ')
begin
declare c_a cursor for select t_name from tt;
declare var_a varchar(20) ' at line 1


mysql的存储过程中,流程控制语句除if、case、loop、while外,还有iterate和leave。

if语句语法为:
if xxx then xxxx
elseif xxx then xxx
else xxx
end if;

case语法:
case  xxx
when xxx then xxx
when xxx then xxx
【else xxx】
end case;

while语法:
while xxxxxxx do
……
end while;


loop语法:
loop
……
end loop;
可以用“leave 循环标签名”退出循环


repeat:
先执行一次循环体,再判断condition:
repeat
……
until condition
end repeat:


iterate表示“再次循环”。与leave功能相反。

 

查看存储过程和函数的状态:
show {procedure|function} status [like 'xxxxx'];
查看存储过程和函数的定义:
show create {procedure|function} sp_name;


修改存储过程和函数:
alter {procedure|function} sp_name xxxxx;
删除存储过程和函数:
drop {procedure|function}[if exists] sp_name;

捕获错误


九、触发器
语法:
1)只包含一条语句
create trigger xxxx before|after [insert|update|delete]
on xxx for each row
……;
2)包含多条语句
create trigger xxxx before|after [insert|update|delete]
on xxx for each row
begin
……
end
;

查看:
show triggers;
select * from information_schema.triggers;
删除:
drop trigger xxxx;

触发器不能包含事务处理语句或call语句


十、事务
mysql有innodb和bdb两种类型的数据表支持事务。要创建事务,必须是这两类表中的一种。
因此首先需要创建或修改,以便得到Innodb或BDB表。
创建:create table xxx(……) type=INNODB/BDB;
修改:alter table xxx type innodb/BDB;


创建事务的一般过程为初始化事务、创建事务、查询数据是否被录入和提交事务。
1)初始化事务:
start transaction;
2)创建事务:
就是执行事务中的操作(insert、update、delete等)
3)查看
用select查看第二步的操作结果
4)提交事务
commit
5)撤销事务
rollback


mysql默认是事务自动提交的,也就是我们每输入一条DML语句后,自动执行commit语句,提

交当前事务。若需要手动提交,可以设置set autocommit=0;
查看该参数的方法为:
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

事务分为序列化、可重复读取、提交后读取、未提交读取四个隔离级别。
mysql默认是可重复读取,即repeatable read。
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)


为了数据的一致性,可以将表锁住:
mysql> lock table t read;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from t;
+------+------+
| id   | code |
+------+------+
|    1 | ACBD |
|    2 | ABCD |
|    3 | BACD |
|    4 | BADC |
+------+------+
4 rows in set (0.00 sec)

mysql> delete from t where code='ACBD';
ERROR 1099 (HY000): Table 't' was locked with a READ lock and can't be updated
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from t where code='ACBD';
Query OK, 1 row affected (0.13 sec)

这是一种mysql的伪事务。 设置lock的类型为read后,用户只能读数据,不能进行其他操作

;若设置lock类型为write,则当前用户可以修改数据,而其他会话中的用户不能进行任何

读操作。


十一、mysql系统管理

工具:
mysqld_safe  启动、监控、重启mysqld服务器程序的工具
mysqladmin   关闭服务器或服务器不正常时检查运行状态等
mysqlcheck、isamchk、myisamchk  对数据表进行分析、优化
mysqldump、mysqlhotcopy  备份或复制工具

数据目录的位置:
mysql> show variables like 'datadir';
+---------------+---------------------------------------------------------------
--------------------+
| Variable_name | Value
                    |
+---------------+---------------------------------------------------------------
--------------------+
| datadir       | D:\Documents and Settings\All Users\Application Data\MySQL\MyS
QL Server 5.5\Data\ |
+---------------+---------------------------------------------------------------
--------------------+
1 row in set (0.00 sec)

也可以用mysqladmin的命令:
mysqladmin variables

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


mysql也有数据字典,可以通过information_schema数据库下的tables表查看:
mysql> select table_schema,table_name from tables;//
+--------------------+----------------------------------------------+
| table_schema       | table_name                                   |
+--------------------+----------------------------------------------+
| information_schema | CHARACTER_SETS                               |
| information_schema | COLLATIONS                                   |
| information_schema | COLLATION_CHARACTER_SET_APPLICABILITY        |
| information_schema | COLUMNS                                      |
| information_schema | COLUMN_PRIVILEGES                            |
| information_schema | ENGINES                                      |
| information_schema | EVENTS                                       |
| information_schema | FILES                                        |
| information_schema | GLOBAL_STATUS                                |
| information_schema | GLOBAL_VARIABLES                             |
| information_schema | KEY_COLUMN_USAGE                             |
| information_schema | PARAMETERS                                   |
| information_schema | PARTITIONS                                   |
| information_schema | PLUGINS                                      |
| information_schema | PROCESSLIST                                  |
| information_schema | PROFILING                                    |
| information_schema | REFERENTIAL_CONSTRAINTS                      |
| information_schema | ROUTINES                                     |
| information_schema | SCHEMATA                                     |
| information_schema | SCHEMA_PRIVILEGES                            |
| information_schema | SESSION_STATUS                               |
| information_schema | SESSION_VARIABLES                            |
| information_schema | STATISTICS                                   |
| information_schema | TABLES                                       |
| information_schema | TABLESPACES                                  |
| information_schema | TABLE_CONSTRAINTS                            |
| information_schema | TABLE_PRIVILEGES                             |
| information_schema | TRIGGERS                                     |
| information_schema | USER_PRIVILEGES                              |
| information_schema | VIEWS                                        |
| information_schema | INNODB_BUFFER_PAGE                           |
| information_schema | INNODB_TRX                                   |
| information_schema | INNODB_BUFFER_POOL_STATS                     |
| information_schema | INNODB_LOCK_WAITS                            |
| information_schema | INNODB_CMPMEM                                |
| information_schema | INNODB_CMP                                   |
| information_schema | INNODB_LOCKS                                 |
| information_schema | INNODB_CMPMEM_RESET                          |
| information_schema | INNODB_CMP_RESET                             |
| information_schema | INNODB_BUFFER_PAGE_LRU                       |
| mysql              | columns_priv                                 |
| mysql              | db                                           |
| mysql              | event                                        |
| mysql              | func                                         |
| mysql              | general_log                                  |
| mysql              | help_category                                |
| mysql              | help_keyword                                 |
| mysql              | help_relation                                |
| mysql              | help_topic                                   |
| mysql              | host                                         |
| mysql              | ndb_binlog_index                             |
| mysql              | plugin                                       |
| mysql              | proc                                         |
| mysql              | procs_priv                                   |
| mysql              | proxies_priv                                 |
| mysql              | servers                                      |
| mysql              | slow_log                                     |
| mysql              | tables_priv                                  |
| mysql              | time_zone                                    |
| mysql              | time_zone_leap_second                        |
| mysql              | time_zone_name                               |
| mysql              | time_zone_transition                         |
| mysql              | time_zone_transition_type                    |
| mysql              | user                                         |
| performance_schema | cond_instances                               |
| performance_schema | events_waits_current                         |
| performance_schema | events_waits_history                         |
| performance_schema | events_waits_history_long                    |
| performance_schema | events_waits_summary_by_instance             |
| performance_schema | events_waits_summary_by_thread_by_event_name |
| performance_schema | events_waits_summary_global_by_event_name    |
| performance_schema | file_instances                               |
| performance_schema | file_summary_by_event_name                   |
| performance_schema | file_summary_by_instance                     |
| performance_schema | mutex_instances                              |
| performance_schema | performance_timers                           |
| performance_schema | rwlock_instances                             |
| performance_schema | setup_consumers                              |
| performance_schema | setup_instruments                            |
| performance_schema | setup_timers                                 |
| performance_schema | threads                                      |

从名称上初步理解为:
“information_schema”是所有数据库对象的属性信息
“mysql”数据库是用户、权限、时区、日志等基本信息
“performance_schema”存储性能相关的设置信息

请使用浏览器的分享功能分享到微信等