多语言展示
当前在线:272今日阅读:2今日分享:38

当sql语句满足不了时,你怎么做?

当sql语句满足不了需求时,可以使用存储过程
工具/原料
1

MySQL

2

Navicat

方法/步骤
1

存储过程使您有机会完成 SQL 提供的简单创建、读取、更新和删除功能以外的操作。你有能力做更多的程序步骤。

2

这样的一个例子是建立一个程序, 向一年以上没有加薪的雇员发放加薪。下图显示了如何在 MySQL 中实现这一点:CREATE PROCEDURE annual_salary_raise( IN percent INT, OUT total_updated INT)BEGIN SELECT COUNT(*) INTO total_updated FROM salaries WHERE last_update_date > DATE_SUB(CURDATE(),INTERVAL 1 YEAR); UPDATE salaries SET annual_salary = annual_salary * ((100 + percent)/100),last_update_date = CURDATE() WHERE last_update_date > DATE_SUB(CURDATE(),INTERVAL 1 YEAR);END;

3

该存储过程采用两个参数: IN 参数, 它是工资增长百分比的值;和 OUT 参数, 您可以将其视为存储过程中的返回值。您在此处传递句柄, 该存储过程将设置其值, 并且可以在运行该句柄后从该句柄中读取。在这种情况下, OUT 参数保存更新的行数。您可以根据需要拥有任意数量的 IN 和 OUT 参数。

4

SELECT 语句还采用了一个新的窗体, 将 COUNT 的结果应用到total _ updated的 OUT 参数中。如果 SELECT 语句返回零行或多行, 则查询将失败。

5

该过程将百分比增加应用于未更新一年以上的行。MySQL 为操作 DATE 数据类型提供了 DATE _ SUB 函数-在本例中, 该函数从 CURDATE (即今天的日期) 计算一年前的日期。更新语句还将更新日期设置为CURDATE, 以便更新后的行在另一年内不会更新。

6

下图显示了 Navicat控制台上的这一过程, 并应用了4% 的加薪。

7

查询工资表:SELECT * FROM salaries;

8

调用存储过程:CALL annual_salary_raise(4,@updated_count);

9

查看工资表变化:SELECT * FROM salaries;

10

存储过程对于 '批处理' 一系列以某些定制方式影响数据的语句非常有用, 如此处所示的过程。另一个用途是在触发器中。当某些数据库事件发生 (如删除或更新行) 时, 可以配置要在该操作之前、之后或之后而不是该操作之前运行的过程。

11

触发器的一个实际用途是记录数据库事件。每当更新敏感表 (如员工工资等财务记录) 时, 您都可以设置一个运行过程, 将更新前后的数据插入辅助审核表中, 该表可以在以后检查是否存在任何差异.

推荐信息