mysql procedure

本文详细介绍MySQL中存储过程及函数的创建与使用方法,包括更改定界符、定义存储过程与函数、调用存储过程及函数、创建分页查询过程等。此外还介绍了如何通过存储过程批量插入数据。

用MySQL命令行首先要

delimiter //

mysql 客户端delimiter命令来把语句定界符从 ;变为//。这就允许用在程序体中的;定界符被传递到服务器而不是被mysql 自己来解释。

 

create procedure procedure_t_a_1(out size int)
begin
    select count(*) into size from t_a;
end
//
 

mysql> call procedure_t_a_1(@a);
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> select @a;
    -> //
+------+
| @a   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)

 

 

CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
RETURN CONCAT('Hello, ',s,'!');
//

 

是returns,注意

 

select hello('hello');
//

 

+----------------+
| hello('hello') |
+----------------+
| Hello, hello!  |
+----------------+
1 row in set (0.01 sec)

mysql> drop procedure procedure_t_a_1//
Query OK, 0 rows affected (0.09 sec)

mysql> drop function hello//
Query OK, 0 rows affected (0.00 sec)

重新create前两个procedures和function

mysql> show create procedure procedure_t_a_1\G
*************************** 1. row ***************************
       Procedure: procedure_t_a_1
        sql_mode: NO_AUTO_CREATE_USER
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `procedure_t_a_1`(
out size int)
begin    select count(*) into size from t_a;end
1 row in set (0.00 sec)

mysql> show create function hello\G
*************************** 1. row ***************************
       Function: hello
       sql_mode: NO_AUTO_CREATE_USER
Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `hello`(s CHAR(20))
RETURNS char(50) CHARSET utf8
RETURN CONCAT('Hello, ',s,'!')
1 row in set (0.00 sec)

 

mysql> show function status like 'hello'\G
*************************** 1. row ***************************
           Db: test
         Name: hello
         Type: FUNCTION
      Definer: root@localhost
     Modified: 2010-07-15 21:22:37
      Created: 2010-07-15 21:22:37
Security_type: DEFINER
      Comment:
1 row in set (0.04 sec)
 

 

把t_b表的内容插入到t_a中,可以用

insert into t_a(id,value) select id,value from t_b;

 或者直接插入值

insert into t_a(id,value) values (6,'a6'),(7,'a7');

 

 

往表中插入n条记录,用存储过程

CREATE PROCEDURE procedure_t_a_insert(IN size int)
BEGIN
  DECLARE myIndex int default 0;
  DECLARE max_id int DEFAULT 1;
  select max(id) into max_id from t_a;
  select max_id;
  repeat
   insert into t_a values (max_id+1, concat('v_',(max_id+1)) );
   set myIndex = myIndex + 1;
   set max_id = max_id + 1;
  until (myIndex>=size) end repeat;
END;
 

传入一个数字,想插入多少条就插入多少条

call procedure_t_a_insert(2);
 

成功插入!

 

修改后

 

CREATE PROCEDURE procedure_t_a_insert(IN size int)
BEGIN
  DECLARE myIndex int default 0;
  DECLARE max_id int DEFAULT 1;
  select max(id) into max_id from t_a;
  select max_id;
  repeat
   insert into t_a values (max_id+1, concat('v_',(max_id+1)) );
   set myIndex = myIndex + 1;
   set max_id = max_id + 1;
  until (myIndex>=size) end repeat;
END;
--
drop procedure procedure_t_a_insert;
call procedure_t_a_insert(12);
--
 

分页查询

 

create procedure procedure_t_a_fenye(in currentPage int,in sizeofpage int)
begin
    declare totalSize int default 1;
    declare totalPage int default 1;
    declare index_begin int default 1;

    declare sSql varchar(1000);

    select count(*) into totalSize from t_a;
    set totalPage = CEILING(totalSize/sizeofpage);
    set @limit_begin = currentPage * sizeofpage;
    set @limit_end = sizeofpage;

    select index_begin,totalSize,sizeofpage,totalSize/sizeofpage,totalPage;
    prepare stmt1 from 'select * from t_a limit ?,?';
    execute stmt1 using @limit_begin,@limit_end;
end;
--
drop procedure if exists procedure_t_a_fenye;
select @limit_begin;
select @limit_end;
call procedure_t_a_fenye(2,5);
 

http://jspengxue.iteye.com/blog/46712

 

写的很好

### 创建存储过程 在 MySQL 中,创建存储过程需要使用 `CREATE PROCEDURE` 语句。存储过程可以接受参数,包含 SQL 语句,以及返回结果。以下是创建存储过程的基本语法: ```sql DELIMITER $$ CREATE PROCEDURE procedure_name (IN parameter1 datatype, OUT parameter2 datatype) BEGIN -- SQL statements END $$ DELIMITER ; ``` - `DELIMITER $$`:更改语句结束符为 `$$`,以避免与 SQL 语句的分号冲突。 - `CREATE PROCEDURE`:定义存储过程的名称和参数。 - `IN parameter1 datatype`:定义输入参数。 - `OUT parameter2 datatype`:定义输出参数。 - `BEGIN ... END`:存储过程的主体,包含 SQL 语句。 例如,创建一个存储过程来检索所有员工: ```sql DELIMITER $$ CREATE PROCEDURE GetAllEmployees() BEGIN SELECT * FROM employees; END $$ DELIMITER ; ``` ### 使用存储过程 调用存储过程需要使用 `CALL` 语句。例如,调用上面创建的 `GetAllEmployees` 存储过程: ```sql CALL GetAllEmployees(); ``` 存储过程还可以接受参数。例如,创建一个存储过程来按部门检索员工: ```sql DELIMITER $$ CREATE PROCEDURE GetEmployeesByDepartment(IN dept_id INT) BEGIN SELECT * FROM employees WHERE department_id = dept_id; END $$ DELIMITER ; ``` 调用该存储过程时传递部门 ID: ```sql CALL GetEmployeesByDepartment(10); ``` ### 管理存储过程 MySQL 提供了多种方式来管理存储过程,包括查看、修改和删除存储过程。 #### 查看存储过程 要查看已创建的存储过程,可以使用 `SHOW CREATE PROCEDURE` 语句: ```sql SHOW CREATE PROCEDURE GetAllEmployees; ``` #### 修改存储过程 MySQL 不支持直接修改存储过程的定义。如果需要修改存储过程,必须先删除它,然后重新创建。 #### 删除存储过程 使用 `DROP PROCEDURE` 语句删除存储过程: ```sql DROP PROCEDURE IF EXISTS GetAllEmployees; ``` ### 存储过程的优势 存储过程在数据库开发中具有多个优势: - **复杂逻辑处理**:存储过程可以包含复杂的业务逻辑,如事务控制、错误处理等。 - **模块化设计**:将大的应用程序分解为多个小的、易于管理的存储过程。 - **提高性能**:存储过程可以被优化,从而提高数据库操作的性能。 - **减少网络流量**:执行复杂操作时,只需调用一个存储过程,而不是发送多个 SQL 语句到服务器[^3]。 ### 示例:带参数的存储过程 以下是一个带输入和输出参数的存储过程示例。该存储过程用于计算某个部门的员工数量: ```sql DELIMITER $$ CREATE PROCEDURE CountEmployeesByDepartment(IN dept_id INT, OUT count INT) BEGIN SELECT COUNT(*) INTO count FROM employees WHERE department_id = dept_id; END $$ DELIMITER ; ``` 调用该存储过程并获取结果: ```sql CALL CountEmployeesByDepartment(10, @count); SELECT @count; ``` ### 示例:使用控制结构 存储过程可以使用控制结构,如 `IF` 和 `CASE`。例如,检查员工的薪资是否低于某个阈值: ```sql DELIMITER $$ CREATE PROCEDURE CheckSalary(IN emp_id INT) BEGIN DECLARE salary DECIMAL(10, 2); SELECT salary INTO salary FROM employees WHERE id = emp_id; IF salary < 5000 THEN SELECT 'Low Salary'; ELSE SELECT 'Normal Salary'; END IF; END $$ DELIMITER ; ``` 调用该存储过程: ```sql CALL CheckSalary(1); ``` ### 示例:数据修改 存储过程可以用于数据修改操作。例如,添加新员工: ```sql DELIMITER $$ CREATE PROCEDURE AddEmployee(IN name VARCHAR(100), IN dept_id INT, IN salary DECIMAL(10, 2)) BEGIN INSERT INTO employees (name, department_id, salary) VALUES (name, dept_id, salary); END $$ DELIMITER ; ``` 调用该存储过程: ```sql CALL AddEmployee('John Doe', 10, 6000); ``` ### 示例:错误处理 存储过程可以包含错误处理逻辑。例如,安全地添加员工: ```sql DELIMITER $$ CREATE PROCEDURE SafeAddEmployee(IN name VARCHAR(100), IN dept_id INT, IN salary DECIMAL(10, 2)) BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN SELECT 'An error occurred, transaction rolled back'; END; START TRANSACTION; INSERT INTO employees (name, department_id, salary) VALUES (name, dept_id, salary); COMMIT; END $$ DELIMITER ; ``` 调用该存储过程: ```sql CALL SafeAddEmployee('Jane Doe', 10, 7000); ``` ### 示例:事务管理 存储过程可以管理事务。例如,薪资转账: ```sql DELIMITER $$ CREATE PROCEDURE TransferSalary(IN from_id INT, IN to_id INT, IN amount DECIMAL(10, 2)) BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'Transaction failed'; END; START TRANSACTION; UPDATE employees SET salary = salary - amount WHERE id = from_id; UPDATE employees SET salary = salary + amount WHERE id = to_id; COMMIT; SELECT 'Transaction succeeded'; END $$ DELIMITER ; ``` 调用该存储过程: ```sql CALL TransferSalary(1, 2, 1000); ``` ### 进阶建议 在使用存储过程时,可以考虑以下进阶建议: - **优化存储过程**:确保存储过程中的 SQL 语句经过优化,以提高性能。 - **使用索引**:在频繁查询的列上创建索引,以加快查询速度。 - **定期维护**:定期检查和维护存储过程,以确保其正常运行。 - **安全性**:确保存储过程的安全性,防止 SQL 注入等攻击。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值