MySQL 5.0 поддерживает хранимые процедуры с момента своего выпуска.
Хранимая процедура — это объект базы данных, который хранит сложные программы в базе данных для вызова внешними программами.
Хранимая процедура — это набор инструкций SQL, предназначенный для выполнения определенной функции. Она компилируется, создается и сохраняется в базе данных. Пользователи могут вызвать и выполнить ее, указав имя хранимой процедуры и передав параметры (при необходимости).
Идея хранимых процедур проста: инкапсуляция и повторное использование кода на уровне языка SQL базы данных.
Преимущества
- Хранимые процедуры могут инкапсулировать и скрывать сложную бизнес-логику.
- Хранимые процедуры могут возвращать значения и принимать параметры.
- Хранимые процедуры нельзя запускать с помощью команды SELECT, поскольку они являются подпрограммами, в отличие от представлений, таблиц или пользовательских функций.
- Хранимые процедуры можно использовать для проверки данных, обеспечения соблюдения бизнес-логики и т. д.
Недостатки
- Хранимые процедуры часто адаптируются под конкретные базы данных, поскольку поддерживаемые языки программирования различаются. При переходе на систему баз данных другого производителя существующие хранимые процедуры приходится переписывать.
- Настройка производительности и написание хранимых процедур ограничены особенностями различных систем баз данных.
I. Создание и вызов хранимых процедур
- Хранимая процедура — это именованный блок кода, используемый для выполнения определенной функции.
- Созданные хранимые процедуры хранятся в словаре данных базы данных.
Создание хранимой процедуры
Основной синтаксис в хранимых процедурах MySQL
Объявите разделитель операторов; его можно настроить:
DELIMITER $$ или DELIMITER //
Объявите хранимую процедуру:
CREATE PROCEDURE demo_in_parameter(IN p_in int)
Символы начала и конца хранимой процедуры:
BEGIN .... END
Присваивание переменной:
SET @p_in=1
Определение переменной:
DECLARE l_int int unsigned default 4000000;
Создание хранимых процедур и хранимых функций MySQL:
create procedure 存储过程名(参数)
Тело хранимой процедуры:
create function 存储函数名(参数)
Пример
Создайте базу данных и сделайте резервную копию таблицы данных для примера операции:
Ниже приведён пример хранимой процедуры, которая удаляет все матчи, в которых участвовал указанный игрок:
Анализ:По умолчанию хранимая процедура связана с базой данных по умолчанию. Если вы хотите создать хранимую процедуру в конкретной базе данных, укажите имя базы данных перед именем процедуры. При определении процедуры используйтеDELIMITER $$команда для изменения разделителя операторов с точки с запятой;временно на два$$, чтобы точки с запятой, используемые в теле процедуры, передавались напрямую серверу и не интерпретировались клиентом (например, mysql).
Вызов хранимой процедуры:
call sp_name[(传参)];
Анализ:В хранимой процедуре задается переменная p_playerno, требующая параметра. При вызове хранимой процедуры переменной p_playerno через параметр присваивается 57, после чего выполняются SQL-операции в хранимой процедуре.
Тело хранимой процедуры
- Тело хранимой процедуры содержит операторы, которые должны выполняться при вызове процедуры, например операторы DML и DDL, операторы IF-THEN-ELSE и WHILE-DO, операторы DECLARE для объявления переменных и т. д.
- Формат тела процедуры: начинается с BEGIN и заканчивается END (может быть вложенным)
BEGIN BEGIN BEGIN statements; END END END
Примечание:Каждый вложенный блок и каждый оператор в нем должны заканчиваться точкой с запятой. Блок BEGIN-END, обозначающий конец тела процедуры (также называемый составным оператором), не требует точки с запятой.
Маркировка блоков операторов:
[begin_label:] BEGIN [statement_list] END [end_label]
Например:
Метки имеют два назначения:
- 1. Повысить читаемость кода
- 2. Некоторые операторы (например, операторы LEAVE и ITERATE) требуют меток
II. Параметры хранимых процедур
Параметры хранимых процедур MySQL используются при определении хранимых процедур. Существует три типа параметров: IN, OUT и INOUT, в следующем виде:
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
- Входной параметр IN: указывает, что вызывающая сторона передаёт значение в процедуру (входное значение может быть литералом или переменной)
- Выходной параметр OUT: указывает, что процедура передаёт значение вызывающей стороне (может возвращать несколько значений) (выходное значение может быть только переменной)
- Входной/выходной параметр INOUT: указывает, что вызывающая сторона передаёт значение в процедуру и что процедура передаёт значение вызывающей стороне (значение может быть только переменной)
1. Входной параметр IN
Из вышесказанного видно, что p_in изменяется в хранимой процедуре, но это не влияет на@p_inзначение последнего, потому что первый является локальной переменной, а последний — глобальной переменной.
2. Выходной параметр OUT
3. Входной/выходной параметр INOUT
Примечание:
1. Если у процедуры нет параметров, вы всё равно должны писать круглые скобки после имени процедуры. Например:
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……
2. Убедитесь, что имена параметров не совпадают с именами столбцов; иначе в теле процедуры имя параметра будет рассматриваться как имя столбца.
Предложения:
- Используйте параметры IN для входных значений.
- Используйте параметры OUT для возвращаемых значений.
- Используйте параметры INOUT как можно реже.
III. Переменные
1. Определение переменных
Объявления локальных переменных должны быть размещены в начале тела хранимой процедуры:
DECLAREvariable_name [,variable_name...] datatype [DEFAULT value];
Здесь datatype — это тип данных MySQL, например INT, FLOAT, DATE, VARCHAR(length)
Например:
2. Присваивание переменных
SET 变量名 = 表达式值 [,variable_name = expression ...]
3. Пользовательские переменные
Использование пользовательских переменных в клиенте MySQL:
Использование пользовательских переменных в хранимых процедурах
Передача пользовательских переменных с глобальной областью видимости между хранимыми процедурами
Примечание:
- 1. Имена пользовательских переменных обычно начинаются с @
- 2. Чрезмерное использование пользовательских переменных может затруднить понимание и управление программой
IV. Комментарии
Хранимые процедуры MySQL могут использовать два стиля комментариев
Два дефиса--: Этот стиль обычно используется для однострочных комментариев.
Стиль C: Обычно используется для многострочных комментариев.
Например:
Вызов хранимых процедур MySQL
Используйте CALL, а затем имя вашей процедуры и круглые скобки. Внутри круглых скобок добавьте параметры по мере необходимости. Параметры включают входные параметры, выходные параметры и входные/выходные параметры. Для конкретных способов вызова обратитесь к примерам выше.
Запрос хранимых процедур MySQL
Если мы хотим узнать, какие таблицы существуют в базе данных, мы обычно используемshowtables;для их просмотра. Тогда, если мы хотим просмотреть хранимые процедуры в базе данных, можем ли мы также использовать этот метод? Ответ: мы можем просматривать хранимые процедуры в базе данных, но другим способом.
Мы можем использовать следующий оператор для запроса:
selectname from mysql.proc where db='数据库名'; 或者 selectroutine_name from information_schema.routines where routine_schema='数据库名'; 或者 showprocedure status where db='数据库名';
Если мы хотим узнать подробности конкретной хранимой процедуры, что нам делать? Можем ли мы также использовать DESCRIBE table_name для её просмотра, как мы делаем с таблицами?
Ответ:Мы можем просмотреть подробности хранимой процедуры, но нам нужно использовать другой метод:
SHOW CREATE PROCEDURE 数据库.存储过程名;
для просмотра подробностей текущей хранимой процедуры.
Изменение хранимых процедур MySQL
ALTER PROCEDURE
Изменение ранее заданной хранимой процедуры, созданной с помощью CREATE PROCEDURE, не влияет на связанные хранимые процедуры или хранимые функции.
Удаление хранимых процедур MySQL
Удаление хранимой процедуры относительно просто, так же как и удаление таблицы:
DROPPROCEDURE
Удаление одной или нескольких хранимых процедур из таблицы MySQL.
Управляющие операторы в хранимых процедурах MySQL
(1). Область видимости переменных
Внутренние переменные имеют более высокий приоритет в своей области видимости. Когда выполнение достигает END, внутренние переменные исчезают. В этот момент они уже находятся вне своей области видимости, и переменные больше не видны, потому что эту объявленную переменную больше нельзя найти вне хранимой процедуры. Однако можно сохранить её значение через OUT-параметр или присвоив её значение переменной сеанса.
(2). Условные операторы
1. Операторы if-then-else
2. оператор case:
(3). Операторы цикла
1. while ···· end while
while 条件 do
--循环体
endwhile
2. repeat···· end repeat
Он проверяет результат после выполнения операции, тогда как while проверяет перед выполнением.
repeat
--循环体
until 循环条件
end repeat;
3. loop ·····endloop
Цикл loop не требует начального условия, подобно циклу while, и, как цикл repeat, не требует условия завершения. Оператор leave используется для выхода из цикла.
4. МЕТКИ:
Метки можно размещать перед операторами begin, repeat, while или loop. Метки операторов можно использовать только перед допустимыми операторами. Они могут выйти из цикла, в результате чего выполняемые инструкции достигнут последнего шага составного оператора.
(4). ITERATE итерация
ITERATE перезапускает составной оператор, ссылаясь на его метку:
Справочные статьи:
https://www.cnblogs.com/geaozhang/p/6797357.html
http://blog.sina.com.cn/s/blog_86fe5b440100wdyt.html