demo 创建存储 过程函数
-- ----------------------------
-- Procedure structure for `getDeptChild`
-- ----------------------------
DROP PROCEDURE IF EXISTS `getDeptChild`;
DELIMITER ;;
CREATE DEFINER=`sunxing_ccs`@`%` PROCEDURE `getDeptChild`(rootId VARCHAR(50))
BEGIN
DECLARE ptemp VARCHAR (4000); #用于存储输出的depart_id字符串集
DECLARE ctemp VARCHAR (4000); #用于存储当前的depart_id
SET ptemp = '';
SET ctemp = rootId;
WHILE ctemp IS NOT NULL DO
IF ptemp = '' THEN #判断是否为第一次查询,解决查询结果第一位为','的问题
SET ptemp = concat(ptemp, ctemp);
ELSE
SET ptemp = concat(ptemp, ',', ctemp);
end if;
#group_conca保存后面符合条件的depart_id FIND_IN_SET查询当前ctemp里是否有与depart_upid相等的值
SELECT group_concat(dept_uuid) INTO ctemp FROM ccs_dept WHERE FIND_IN_SET(parent_uuid, ctemp) > 0;
END WHILE;
SELECT ptemp;
END
;;
DELIMITER ;
1. 修改存储过程和函数
使用 ALTER 语句可以修改存储过程或函数的特性,语法格式如下:
ALTER { PROCEDURE | FUNCTION } sp_name [ characteristic ... ]
其中,那 sp_name 参数表示存储过程或函数的名称;characteristic 参数指定存储函数的特性,可能的取值有:
CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句。
NO SQL 表示了程序中不包含 SQL 语句。
READS SQL DATA 表示子程序中包含读数据的语句。
MODIFIES SQL DATA 表示子程序中包含写数据的语句。
SQL SECURITY { DEFINER | INVOKER } 指明谁有权限来执行。
DEFINER 表示只有定义者自己才能够执行。
INVOKER 表示调用者可以执行。
COMMENT 'string' 表示注释信息。
【注】修改存储过程使用 ALTER PROCEDURE 语句,修改存储函数使用 ALTER FUNCTION 语句,这两个语句的结构是一样的,语句中的所有参教也是一样的,而且,它们与创建存储过程或函数的语句中的参数基本也是一样的,
【例】修改存储过程 CountProc 的定义,将读写权限改为 MODIFIES SQL DATA,并指明调用者可以执行。
修改之前:
mysql> SELECT SPECIFIC_NAME ,SQL_DATA_ACCESS , SECURITY_TYPE
-> FROM information_schema.Routines
-> WHERE ROUTINE_NAME = 'CountProc1' AND ROUTINE_TYPE = 'PROCEDURE';
+---------------+-----------------+---------------+
| SPECIFIC_NAME | SQL_DATA_ACCESS | SECURITY_TYPE |
+---------------+-----------------+---------------+
| CountProc1 | CONTAINS SQL | DEFINER |
+---------------+-----------------+---------------+
修改语句:
mysql> ALTER PROCEDURE CountProc1
-> MODIFIES SQL DATA
-> SQL SECURITY INVOKER;
Query OK, 0 rows affected (0.00 sec)
查看执行结果:
mysql> SELECT SPECIFIC_NAME ,SQL_DATA_ACCESS , SECURITY_TYPE
-> FROM information_schema.Routines
-> WHERE ROUTINE_NAME = 'CountProc1' AND ROUTINE_TYPE = 'PROCEDURE';
+---------------+-------------------+---------------+
| SPECIFIC_NAME | SQL_DATA_ACCESS | SECURITY_TYPE |
+---------------+-------------------+---------------+
| CountProc1 | MODIFIES SQL DATA | INVOKER |
+---------------+-------------------+---------------+
1 row in set (0.00 sec)
2. 删除存储过程和函数
删除存储过程和函数可以使用 DROP 语句,其语法结构如下:
DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] Sp_name
sp_name 为要移除的存储过程或函数的名称。
IF EXISTS 子句是 MySQL 的一个扩展。如果程序或函数不存储,它可以防止发生错误,产生一个用 SHOW WARNINGS 查看的警告。
【例】删除存储过程和存储函数。代码如下:
mysql> DROP PROCEDURE CountProc;
Query OK, 0 rows affected (0.50 sec)
mysql> DROP FUNCTION CountProc2;