Хранимая процедура (хранимая процедура) — это набор операторов SQL, которые используются для выполнения определенных функций в большой системе баз данных. Она хранится в базе данных и является постоянной после однократной компиляции. дает параметры (если хранимая процедура с параметрами) для ее выполнения. Хранимая процедура — важный объект в базе данных. Когда объем данных особенно велик, эффективность можно удвоить за счет использования хранимых процедур.
Хранимая процедура — важный объект в базе данных.
Хранимая процедура — это набор операторов SQL в системе базы данных, которые используются для выполнения определенных функций. Хранимые процедуры хранятся в базе данных, компилируются один раз и запускаются повсюду. Нет необходимости компилировать заново, пользователь может выполнить ее, указав имя хранимой процедуры и передав параметры (если хранимая процедура имеет параметры).
Используется для завершения более сложных дел. Относительно гибкий, легко модифицируемый, простой в написании и легко программируемый. Написанные хранимые процедуры можно использовать повторно.
преимущество
Хранимые процедуры компилируются непосредственно при их создании, а операторы SQL должны компилироваться каждый раз при их использовании, что очень эффективно.
Хранимые процедуры можно использовать повторно.
Хранимая процедура подключается к базе данных только один раз, тогда как оператор SQL подключается к базе данных несколько раз при доступе к нескольким таблицам.
Сохраненные программы безопасны. Предоставьте соответствующие разрешения приложению хранимой процедуры. недостаток Созданные там хранимые процедуры могут использоваться только там и имеют плохую переносимость.
Если при разработке хранимых процедур стандарты не установлены должным образом, последующее обслуживание будет затруднено.
Без специального редактора разработка и отладка неудобны.
Слишком сложная бизнес-логика не может быть решена с помощью хранимых процедур.
Формат:
create procedure имя процедуры()
begin
......
end;
Случай:
Просмотр полной информации в таблицах сотрудников и отделов
create procedure dept_emp()
begin
select * from dept;
select * from emp;
end;
mysql> call dept_emp();
+----+-----------+
| id | name |
+----+-----------+
| 1 | Отдел исследований и разработок |
| 2 | Канальный отдел |
| 3 | Департамент по академическим вопросам |
| 4 | Исполнительный отдел |
+----+-----------+
4 строка в наборе данных (0.02 Второй)
+----+--------+--------+--------+------------+---------+
| id | name | gender | salary | join_date | dept_id |
+----+--------+--------+--------+------------+---------+
| 1 | Чжан Сан | мужской | 7200 | 2013-02-24 | 1 |
| 2 | Джон Доу | мужской | 3600 | 2010-12-02 | 2 |
| 3 | Ван Ву | мужской | 9000 | 2008-08-08 | 2 |
| 4 | Чжао Лю | женский | 5000 | 2015-10-07 | 3 |
| 5 | У Ци | женский | 4500 | 2011-03-14 | 1 |
| 6 | Ван И | мужской | 8768 | 2013-12-05 | NULL |
| 7 | Ван Эр | женский | NULL | NULL | NULL |
+----+--------+--------+--------+------------+---------+
7 строка в наборе данных (0.05 Второй)
Query OK, 0 rows affected (0.05 Второй)
Формат:
declare имя переменной Тип переменной default значение по умолчанию; #Объявляем переменные
set имя переменной=ценить; #Присваивание переменной
select Имя поля into имя переменной from база данныхповерхность; #Запрашиваем поля таблицы и завершаем присвоение переменной
select имя переменной; #отобразить переменные
Случай:
Просмотрите имя сотрудника с id=1 в таблице сотрудников.
create procedure emp_name()
begin
declare ename varchar(20) default '';
select name into ename from emp where id=1;
select ename;
end;
mysql> call emp_name();
+--------+
| ename |
+--------+
| Чжан Сан |
+--------+
1 строка в наборе данных (0.01 Второй)
Query OK, 0 rows affected (0.01 Второй)
Переменные в хранимых процедурах имеют область действия. Область действия находится между блоками начала и конца. Область действия переменной заканчивается, когда заканчивается конец.
Переменные можно разделить на:
Локальные переменные: между начальным и конечным блоками
Глобальные переменные: Размещаются перед всеми блоками кода. Переменные параметров являются глобальными и могут работать между несколькими блоками.
Случай:
Сверьте количество сотрудников с количеством отделов в таблице отделов и узнайте максимальную и минимальную заработную плату (локальные переменные)
create procedure dept_or_emp()
begin
begin
declare e_n int default 0;
declare d_n int default 0;
select count(*) into e_n from emp;
select count(*) into d_n from dept;
select e_n,d_n;
end;
begin
declare max_s double default 0;
declare min_s double default 0;
select max(salary) into max_s from emp;
select min(salary) into min_s from emp;
select max_s,min_s;
end;
end;
mysql> call dept_or_emp();
+------+------+
| e_n | d_n |
+------+------+
| 7 | 4 |
+------+------+
1 строка в наборе данных (0.26 Второй)
+-------+-------+
| max_s | min_s |
+-------+-------+
| 9000 | 3600 |
+-------+-------+
1 строка в наборе данных (0.26 Второй)
Query OK, 0 rows affected (0.26 Второй)
Просмотрите количество сотрудников в сравнении с количеством отделов в таблице отделов и узнайте максимальную и минимальную заработную плату (глобальные переменные).
create procedure dept_or_emp1()
begin
declare e_n int default 0;
declare d_n int default 0;
declare max_s double default 0;
declare min_s double default 0;
begin
select count(*) into e_n from emp;
select count(*) into d_n from dept;
end;
begin
select max(salary) into max_s from emp;
select min(salary) into min_s from emp;
end;
select e_n,d_n,max_s,min_s;
end;
mysql> call dept_or_emp1();
+------+------+
| e_n | d_n |
+------+------+
| 7 | 4 |
+------+------+
1 строка в наборе данных (0.22 Второй)
+-------+-------+
| max_s | min_s |
+-------+-------+
| 9000 | 3600 |
+-------+-------+
1 строка в наборе данных (0.23 Второй)
Query OK, 0 rows affected (0.23 Второй)
Формат:
create procedure Имя процесса ([IN|OUT|INOUT] Имя параметра Тип данных параметра )
begin
......
end;
Уведомление:
in: передать параметры
out: исходящие параметры
inout: может быть передан или выведен
Указывает, что значение этого параметра необходимо указать перед вызовом хранимой процедуры. Если оно не указано явно как in, по умолчанию используется тип in.
Случай:
Просмотрите имя сотрудника на основе переданного идентификатора.
create procedure emp_id(eid int)
begin
declare ename varchar(20) default '';
select name into ename from emp where id=eid;
select ename;
end;
mysql> call emp_id(1);
+--------+
| ename |
+--------+
| Чжан Сан |
+--------+
1 строка в наборе данных (0.01 Второй)
Query OK, 0 rows affected (0.01 Второй)
mysql> call emp_id(2);
+--------+
| ename |
+--------+
| Джон Доу |
+--------+
1 строка в наборе данных (0.01 Второй)
Query OK, 0 rows affected (0.02 Второй)
mysql> call emp_id(9);
+-------+
| ename |
+-------+
| |
+-------+
1 строка в наборе данных (0.01 Второй)
Query OK, 0 rows affected (0.01 Второй)
Параметр out также необходимо указать, но он должен быть переменной, а не константой.
Случай:
На основе входящего идентификатора верните имя сотрудника.
create procedure emp_id1(eid int,out ename varchar(20))
begin
select name into ename from emp where id=eid;
end;
mysql> set @ename='';
Query OK, 0 rows affected (0.02 Второй)
mysql> call emp_id1(3,@ename);
Query OK, 1 rows affected, 1 warnings (0.02 Второй)
mysql> select @ename;
+--------+
| @ename |
+--------+
| Ван Ву |
+--------+
1 строка в наборе данных (0.02 Второй)
Если вам нужно вводить и выводить данные одновременно, вы можете использовать параметры типа INOUT.
Случай:
На основе входящего идентификатора верните идентификатор и имя сотрудника.
create procedure emp_id2(inout eid int,out ename varchar(20))
begin
select id,name into eid,ename from emp where id=eid;
end;
mysql> set @eid=3;
Query OK, 0 rows affected (0.01 Второй)
mysql> set @ename='';
Query OK, 0 rows affected (0.01 Второй)
mysql> call emp_id2(@eid,@ename);
Query OK, 1 rows affected (0.01 Второй)
mysql> select @eid,@ename;
+------+--------+
| @eid | @ename |
+------+--------+
| 3 | Ван Ву |
+------+--------+
1 строка в наборе данных (0.01 Второй)
Формат:
if()
then
...
else
...
end if;
Случай:
Введите идентификатор и определите, является ли это четным числом. При четных числах печатается соответствующее имя, а при нечетных числах — идентификатор.
create procedure emp_if_id(eid int)
begin
declare ename varchar(20) default '';
if(eid%2=0)
then
select name into ename from emp where id=eid;
select ename;
else
select eid;
end if;
end;
mysql> call emp_if_id(2);
+--------+
| ename |
+--------+
| Джон Доу |
+--------+
1 строка в наборе данных (0.02 Второй)
Query OK, 0 rows affected (0.02 Второй)
mysql> call emp_if_id(1);
+------+
| eid |
+------+
| 1 |
+------+
1 строка в наборе данных (0.01 Второй)
Query OK, 0 rows affected (0.01 Второй)
Формат:
if()
then
...
elseif()
then
...
else
...
end if;
Случай:
Сотрудникам с идентификаторами 1, 2 и 3 повысьте зарплату на 1000 юаней, в то время как остальные сотрудники останутся без изменений.
create procedure emp_if_salary(eid int)
begin
declare esalary double default 0;
if(eid=1)
then
update emp set salary=salary+1000 where id=eid;
elseif(eid=2)
then
update emp set salary=salary+1000 where id=eid;
elseif(eid=3)
then
update emp set salary=salary+1000 where id=eid;
else
update emp set salary=salary where id=eid;
end if;
select salary into esalary from emp where id=eid;
select esalary;
end;
mysql> call emp_if_salary(1);
+---------+
| esalary |
+---------+
| 8200 |
+---------+
1 строка в наборе данных (0.03 Второй)
Query OK, 0 rows affected (0.05 Второй)
mysql> call emp_if_salary(3);
+---------+
| esalary |
+---------+
| 10000 |
+---------+
1 строка в наборе данных (0.02 Второй)
Query OK, 0 rows affected (0.02 Второй)
mysql> call emp_if_salary(9);
+---------+
| esalary |
+---------+
| 0 |
+---------+
1 строка в наборе данных (0.02 Второй)
Query OK, 0 rows affected (0.02 Второй)
Формат:
case()
when... then...
when... then...
else...
end case;
Случай:
Сотрудникам с идентификаторами 1, 2 и 3 повысьте зарплату на 1000 юаней, в то время как остальные сотрудники останутся без изменений.
create procedure emp_case_salary(eid int)
begin
declare esalary double default 0;
case (eid)
when 1 then update emp set salary=salary+1000 where id=eid;
when 2 then update emp set salary=salary+1000 where id=eid;
when 3 then update emp set salary=salary+1000 where id=eid;
else
update emp set salary=salary where id=eid;
end case;
select salary into esalary from emp where id=eid;
select esalary;
end;
mysql> call emp_case_salary(3);
+---------+
| esalary |
+---------+
| 12000 |
+---------+
1 строка в наборе данных (0.02 Второй)
Query OK, 0 rows affected (0.02 Второй)
Формат:
пока (выражение) do
......
end while;
Случай:
Запросить имена первых 5 сотрудников в таблице сотрудников по идентификатору.
create procedure emp_view()
begin
declare eid int default 1;
declare ename varchar(20) default '';
while(eid<=5) do
select name into ename from emp where id=eid;
select ename;
set eid=eid+1;
end while;
end;
mysql> call emp_view();
+--------+
| ename |
+--------+
| Чжан Сан |
+--------+
1 строка в наборе данных (0.01 Второй)
+--------+
| ename |
+--------+
| Джон Доу |
+--------+
1 строка в наборе данных (0.01 Второй)
+--------+
| ename |
+--------+
| Ван Ву |
+--------+
1 строка в наборе данных (0.02 Второй)
+--------+
| ename |
+--------+
| Чжао Лю |
+--------+
1 строка в наборе данных (0.02 Второй)
+--------+
| ename |
+--------+
| У Ци |
+--------+
1 строка в наборе данных (0.03 Второй)
Query OK, 0 rows affected (0.03 Второй)
Формат:
repeat
...
until состояние -- состояниеучредил,Выйти из цикла
....
конец повтора;
Случай:
Запросить имена первых 5 сотрудников в таблице сотрудников по идентификатору.
create procedure emp_view1()
begin
declare eid int default 1;
declare ename varchar(20) default '';
repeat
select name into ename from emp where id=eid;
select ename;
set eid=eid+1;
until eid>5
end repeat;
end;
mysql> call emp_view1();
+--------+
| ename |
+--------+
| Чжан Сан |
+--------+
1 строка в наборе данных (0.02 Второй)
+--------+
| ename |
+--------+
| Джон Доу |
+--------+
1 строка в наборе данных (0.03 Второй)
+--------+
| ename |
+--------+
| Ван Ву |
+--------+
1 строка в наборе данных (0.05 Второй)
+--------+
| ename |
+--------+
| Чжао Лю |
+--------+
1 строка в наборе данных (0.06 Второй)
+--------+
| ename |
+--------+
| У Ци |
+--------+
1 строка в наборе данных (0.06 Второй)
Query OK, 0 rows affected (0.06 Второй)
Курсор — это временная область, в которой сохраняются результаты запроса.
Формат:
declare имя курсора cursor for оператор SQL; #Объявляем курсор
open имя курсора; #Открыть курсор
fetch имя курсора into имя переменной; #Получаем значение курсора
close имя курсора; #Закрыть курсор
Случай:
Выведите идентификатор и имя в таблице сотрудников.
create procedure emp_all_view()
begin
declare eid int default 1;
declare ename varchar(20) default '';
declare c_emp cursor for select id,name from emp;
open c_emp;
fetch c_emp into eid,ename;
select eid,ename;
close c_emp;
end;
mysql> call emp_all_view();
+------+--------+
| eid | ename |
+------+--------+
| 1 | Чжан Сан |
+------+--------+
1 строка в наборе данных (0.03 Второй)
Query OK, 0 rows affected (0.03 Второй)
Таким образом, мы извлекли только одну часть информации. Нужно ли нам сейчас зацикливаться?
create procedure emp_all_view1()
begin
declare eid int default 1;
declare ename varchar(20) default '';
declare c_emp cursor for select id,name from emp;
open c_emp;
loop
fetch c_emp into eid,ename;
select eid,ename;
end loop;
close c_emp;
end;
mysql> call emp_all_view1();
+------+--------+
| eid | ename |
+------+--------+
| 1 | Чжан Сан |
+------+--------+
1 строка в наборе данных (0.01 Второй)
+------+--------+
| eid | ename |
+------+--------+
| 2 | Джон Доу |
+------+--------+
1 строка в наборе данных (0.02 Второй)
+------+--------+
| eid | ename |
+------+--------+
| 3 | Ван Ву |
+------+--------+
1 строка в наборе данных (0.03 Второй)
+------+--------+
| eid | ename |
+------+--------+
| 4 | Чжао Лю |
+------+--------+
1 строка в наборе данных (0.03 Второй)
+------+--------+
| eid | ename |
+------+--------+
| 5 | У Ци |
+------+--------+
1 строка в наборе данных (0.03 Второй)
+------+--------+
| eid | ename |
+------+--------+
| 6 | Ван И |
+------+--------+
1 строка в наборе данных (0.04 Второй)
+------+--------+
| eid | ename |
+------+--------+
| 7 | Ван Эр |
+------+--------+
1 строка в наборе данных (0.05 Второй)
No data - zero rows fetched, selected, or processed
Формат:
show procedure status [like '%нить%'];
Случай:
mysql> show procedure status;
mysql>show procedure status like '%emp%';
Формат:
drop procedure имя процесса хранилища;
Случай:
mysql> drop procedure emp_id;
Query OK, 0 rows affected (0.02 Второй)
Самая большая разница между функциями и хранимыми процедурами заключается в том, что функции должны иметь возвращаемое значение, иначе будет сообщено об ошибке.
Формат:
create function Имя функции (параметр) returns Тип возврата
begin
.....
return возвращаемое значение;
end;
Случай:
Получите имя сотрудника, введя идентификатор
create function getName(eid int) returns varchar(20)
begin
declare ename varchar(20) default '';
select name into ename from emp where id=eid;
return ename;
end;
Уведомление:
Когда мы включаем bin-log, мы должны указать, что наша функция указывает детерминированный и неопределенный параметр. no sql Оператор SQL отсутствует, и, конечно, данные не будут изменены. читает данные sql, только читает данные, конечно, не изменяет данные изменяет данные sql для изменения данных содержит SQL содержит операторы SQL
create function getName(eid int) returns varchar(20) reads sql data
begin
declare ename varchar(20) default '';
select name into ename from emp where id=eid;
return ename;
end;
mysql> select getName(1);
+------------+
| getName(1) |
+------------+
| Чжан Сан |
+------------+
1 строка в наборе данных (0.02 Второй)
Формат:
show function status [like '%нить%'];
Случай:
mysql> show function status;
mysql> show function status like '%getName%';
Формат:
drop function имя функции;
Случай:
mysql> drop function getName;
Query OK, 0 rows affected (0.03 Второй)
Триггеры аналогичны функциям и хранимым процедурам. Триггер — это объект, который может инициировать некоторые действия в зависимости от времени работы таблицы. Этими действиями могут быть операции вставки, обновления, удаления и другие.
create trigger имя триггера Время срабатывания триггерное событие on поверхность for each row
begin
-- Триггерное тело содержимого, заканчивайте каждую строку точкой с запятой
end
Уведомление:
Время срабатывания:
когда команда SQL возникает, когда,Приведет к изменению данных в строке,И каждыйповерхность Соответствующая строка имеет два состояния:До и после манипуляции данными
до: состояние до изменения данных в таблице.
after: состояние после изменения данных в таблице.
Триггерное событие:
Триггеры срабатывают только при отправке изменений данных, а соответствующие операции — это только вставка, обновление и удаление.
Случай:
При вставке данных в таблицу сотрудников запишите вставленный идентификатор, действие и время.
#Создать действиеповерхность
create table emp_log(
id int primary key auto_increment,
eid int,
eaction varchar(20),
etime datetime
);
mysql> select * from emp_log;
пустой набор данных (0.01 Второй)
#Создаем триггер
create trigger emp_insert after insert on emp for each row
begin
insert into emp_log values(null,NEW.id,'insert',now());
end;
mysql> insert into emp(id,name,gender)values(8,'Ван Сан','мужской');
Query OK, 1 rows affected (0.01 Второй)
mysql> select * from emp_log;
+----+------+---------+---------------------+
| id | eid | eaction | etime |
+----+------+---------+---------------------+
| 1 | 8 | insert | 2020-02-21 03:12:44 |
+----+------+---------+---------------------+
1 строка в наборе данных (0.02 Второй)
Формат:
show triggers [like '%нить%'];
Случай:
mysql> show triggers;
mysql> show triggers like '%emp%';
Формат:
drop trigger Имя триггера;
Случай:
mysql> drop trigger emp_insert;
Query OK, 0 rows affected (0.02 Второй)
События заменяют работу, которая ранее выполнялась только запланированными задачами операционной системы, а планировщик событий MySQL может точно выполнять одну задачу каждую секунду, в то время как запланированные задачи операционной системы могут выполняться точно только один раз в минуту.
Формат:
create event[IF NOT EXISTS] event_name -- Создать событие
on schedule время и частота -- on schedule Когда оно будет исполнено?
[on completion [NOT] preserve] -- Будет ли сохранен план планирования после завершения выполнения
[enable | disable] -- Включить ли события, включено по умолчанию
[comment 'Описание события'] -- Заметки о событии
do event_body;-- SQL, который необходимо выполнить
Уведомление:
Пример одной запланированной задачи Казнен один раз в 4:00 1 февраля 2019 г. on schedule at ‘2019-02-01 04:00:00’
Повторить выполнение плана on schedule every 1 second Выполнять раз в секунду on schedule every 1 minute Выполнять раз в минуту on schedule every 1 day Выполнять один раз в день
Повторяющиеся запланированные задачи в указанном диапазоне времени Выполняется один раз в день в 20:00:00. on schedule every 1 day starts ‘2019-02-01 20:00:00’
Случай:
Каждые 5 секунд вставляйте предыдущую запись даты и времени в emp_log.
mysql> desc emp_log;
create event e_insert on schedule every 5 second on completion preserve
enable
comment «Вставлять каждые 5 секунд»
do
begin
insert into emp_log values(null,1,'insert1',now());
end;
#do call хранилищепроцесс
#do select имя функции
Формат:
show events;
Случай:
mysql> show events;
Формат:
alter event название события disable/enable;
Отключить событие
mysql> alter event e_insert disable;
Query OK, 0 rows affected (0.01 Второй)
mysql> select * from emp_log;
включить событие
mysql> alter event e_insert enable;
Query OK, 0 rows affected (0.02 Второй)
mysql> select * from emp_log;
Формат:
drop event название события;
Случай:
mysql> drop event e_insert;
Query OK, 0 rows affected (0.02 Второй)
mysql> show events;
пустой набор данных (0.01 Второй)