自动调用mysql存储过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动调用mysql存储过程相关的知识,希望对你有一定的参考价值。
我在mysql数据库里创建了一个存储过程,想在crontab里调用,但是不知道shell脚本怎么写?请教高手
存储过程还是用SQL里的事件触发比较好,用create trigger写一个,换个方法试试! 参考技术A create table b(id int);create procedure proc(in columnName char (30),in columnValue int)
begin
declare sqltxt varchar(1000) ;
set sqltxt="insert into b("+columnName+") values("+columnValue+")";
prepare stmt from @sqltxt;
execute stmt;
deallocate prepare stmt;
end
Mysql存储过程
1、 什么是存储过程
简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;
ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用
2、 实现一个简单的存储过程
## 如果已经存在 则删除 drop procedure if exists proc_addre; delimiter ;; ## 把默认的输入的结束符;替换成;; ## 创建一个 求和的 存储过程 ## DEFINER 创建者 可以省略 DEFINER=\'root\'@\'localhost\' 默认当前登录人 CREATE DEFINER=\'root\'@\'localhost\' PROCEDURE proc_addre(IN a int, IN b int, OUT sum int) BEGIN if a is null then set a = 0; end if; if b is null then set b = 0; end if; set sum = a + b; END;; delimiter ; SET @b=5; ## 定义变量 b=5 CALL proc_addre(2, @b, @s); ## 运行存储过程 SELECT @s as sum; ## 打印 s 变量
3、IF语句
## 存储过程 IF 语句 DROP PROCEDURE IF EXISTS proce_if; delimiter ;; CREATE PROCEDURE porce_if (IN type INT) BEGIN ## begin end; 是存储过程的块标示方法,类似PHP函数中的 { } declare c VARCHAR(100); ## 定义一个 变长字符串 c IF type = 0 THEN SET c = \'param is 0\'; ELSEIF type = 1 THEN SET c = \'param is 1\'; ELSE set c = \'param is others, not 0 or 1\'; END IF; SELECT c ; END;; delimiter; CALL porce_if(1);
4、 case语句
## 存储过程 case 语句 感觉有点像 PHP 中的 switch 语句 DROP PROCEDURE IF EXISTS proce_case; delimiter ;; CREATE PROCEDURE proce_case (IN type INT) BEGIN ## begin end; 是存储过程的块标示方法,类似PHP函数中的 { } declare c VARCHAR(100); ## 定义一个 变长字符串 c CASE type WHEN 0 THEN SET c = \'param is 0\'; WHEN 1 THEN SET c = \'param is 1\'; ELSE set c = \'param is others, not 0 or 1\'; END CASE; SELECT c; END;; delimiter; CALL proce_case(1);
5、 循环语句 while
## 存储过程 while 循环 DROP PROCEDURE IF EXISTS proce_while; delimiter ;; CREATE PROCEDURE proce_while (IN n INT) BEGIN ## begin end; 是存储过程的块标示方法,类似PHP函数中的 { } declare i int; declare s int; set i=0; set s=0; WHILE i <= n DO ## i <= n 是判断条件 set s=s+i; set i=i+1; END WHILE; SELECT s; END;; delimiter; CALL proce_while(100);
6、删除存储过程
drop procedure if EXISTS proce_test;
注意事项: 不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
7、 显示所有的存储过程的状态,分析各列字段含义
SHOW PROCEDURE STATUS; ## 也可以到 mysql 数据库中 proc表查看。 select * from mysql.proc;
① db : 对应的数据库名
② name : 存储过程名称
③ type : 类型 这里还有可能是 FUNCTION,函数的话就是function, 存储过程就是procedure。
④ definer 定义者
⑤ modified 修改时间
⑥ create 创建时间
⑦ security_type 创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来告诉mysql在执行存储过程的时候,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。
默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。
DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,mysql会检查DEFINER定义的用户\'user_name\'@\'host_name\'的权限;
INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。这个列比较重要。
##案例一:DEFINER CREATE DEFINER = \'admin\'@\'localhost\' PROCEDURE account_count() BEGIN SELECT \'Number of accounts:\', COUNT(*) FROM mysql.user; END; ##在这个案例中,不论哪个用户A调用存储过程,存储过程都会以\'admin\'@\'localhost\'的权限去执行,即使这个用户A没有查询mysql.user表的权限。
##案例二:INVOKER CREATE DEFINER = \'admin\'@\'localhost\' PROCEDURE account_count() SQL SECURITY INVOKER BEGIN SELECT \'Number of accounts:\', COUNT(*) FROM mysql.user; END; ##在这个案例中,虽然存储过程语句中仍然带有DEFINER参数,但是由于SQL SECURITY指定了INVOKER,所以在存储过程执行的时候,会以调用者的额身份去执行。此时这个存储过程是否能成功执行,取决于调用者是否有mysql.user表的查询权限。
⑧ comment : 注释
⑨ character_set_client : mysql 服务器的接受数据的编码
⑩ collation_connection : sql执行时的校验规则 utf8_general_ci 标示 utf-8不区分大小写
圈圈11 database collation : 数据库的编码规则
8. 查看存储过程的详细信息
SHOW CREATE PROCEDURE porce_if;
① sql_mode 是mysql 中sql执行时的错误级别。这个去百度看看。
② create procedure 是 创建储存过程的代码
以上是关于自动调用mysql存储过程的主要内容,如果未能解决你的问题,请参考以下文章