因公司业务的需求学习了下,mysql 的存储过程。
之前一直用的是oracle的数据库,现在工作需要用的mysql 的数据库。对mysql存储过程学习做如下总结:
在mysql 里面的存储过程是被成为函数的,定时的去执行一个函数是叫作时间的执行
create proceduret_insert_table()
-- 里面是具体的执行
/** 标记是否出错 */
declare t_error int default 0;
/** 如果出现sql异常,则将t_error设置为1后继续执行后面的操作 */
declare continue handler for sqlexceptionset t_error=1; -- 出错处理
/** 显式的开启事务,它开启后,事务会暂时停止自动提交*/
-- start transaction;
/** 关闭事务的自动提交 */
set autocommit = 0;
insert into t_test(parent_id,child_id)values('A','abcded');
insert into t_test(name,age)values('zhangsan',null);
/** 标记被改变,表示事务应该回滚 */
if t_error=1 then
rollback; -- 事务回滚
else
commit; -- 事务提交
end if;
end
在mysql里面根据原表去创建目标表的时候,我在网上找的资料是
-----
复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM
旧表
-----
只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
只复制表的结构到新表上面红色的部分是不对的,
我是使用如下的sql执行正常操作的
Create table 新表 like 旧表
我自己做的一个小的测试如下:
CREATE PROCEDURE myinfo()
begin
set@i=curdate();
set@time=REPLACE(@i,"-","");
set@timeStr=SUBSTR(@time,3,4); /*对时间格式进行处理*/
set@sqlstr=CONCAT('CREATE TABLE `ss_cdr_cdr_info_',cast(@timeStr as char),'` likess_cdr_cdr_info');
prepare stmt from @sqlstr;
execute stmt;
End;
网上学习创建定时器处理如下:
mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job。下面创建表:
create table mytable (
id int auto_increment not null,
name varchar(100) not null default'',
introduce text not null,
createtime timestamp not null,
constraint pk_mytable primarykey(id)
)
创建存储过程,这里的存储过程主要提供给mysql的定时器event来调用去执行:
create procedure mypro()
BEGIN
insert into mytable(name,introduce,createtime) values ('1111','inner mongolia',now());
end;
这里只是简单的写了一下,只是为了说明例子。
紧接着创建mysql的定时器event:
create event if not existseventJob
on schedule every 1 second
on completion PRESERVE
do call mypro();
这里设置为每一秒执行一次
至此所有的准备工作已经写完了,做完这些,mysql要想利用定时器必须的做准备工作,就是把mysql的定时器给开启了:
SET GLOBAL event_scheduler =1; -- 启动定时器
SET GLOBAL event_scheduler =0; -- 停止定时器
紧接着还要开启事件:
ALTER EVENT eventJob ON COMPLETION PRESERVE ENABLE; --
开启事件
ALTER EVENT eventJob ON COMPLETION PRESERVE DISABLE; --
关闭事件
SHOW VARIABLES LIKE '%sche%'; -- 查看定时器状态
真的是很实用。