Данная статья посвящена хранимым процедурам и функциям в MySQL.Она основана на различных источниках сети интернет.
-серия статей на mysqltutorial.org
-официальная документация mysql
и др. источники
Содержание статьи
Простейший пример с хранимой процедурой без параметров
Пример хранимой процедуры с входными IN параметрами
Пример хранимой процедуры с выходными OUT параметрами
Пример хранимой процедуры с входными / выходными INOUT параметрами
Пример процедуры со множественными INOUT параметрами
Вообще говоря информации по MySQL достаточно много. Здесь я постараюсь на простых примерах разобраться как пользоваться “хранимками” в MySQL. Почти все примеры составлены самостоятельно, протестированы в консоли MySQL и клиенте Delphi. В посте про использование хранимых процедур в Delphi FireDAC мы видели следующее
Что такое параметры процедур?
В принципе это тоже самое, что и параметры функций, процедур в языках программирования. Параметры разделяют на следующие виды
– IN параметры. Входящие. Это то, что мы отправляем вместе с SQL запросом. Эти параметры уходят в процедуру, процедура их обрабатывает при исполнении.
–OUT параметры. Исходящие. Это что-то вроде результата. Процедура отработала и через OUT параметры мы можем получить свой результат.
–INOUT параметры. Входящие и Исходящие одновременно. Их можно использовать как IN или как OUT или одновременно, например, при создании счетчика.
Простейший пример с хранимой процедурой без параметров
Разберем несколько примеров. Начнем с простого, создадим на сервере простейшую хранимую процедуру.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DROP PROCEDURE IF EXISTS SELECT_ALL; DELIMITER // CREATE PROCEDURE SELECT_ALL() BEGIN SELECT*FROM FIRSTTABLE; END// DELIMITER ; |
Добавим её на сервер через консоль
Теперь проверим есть ли она там на самом деле через следующую инструкцию
1 |
select name from mysql.proc where db='array_db'; |
Да, действительно процедура добавлена и мы видим следующее
Теперь далее, попробуем вызвать нашу процедуру при помощи следующего кода
1 |
call select_all(); |
Всё Ок, на сервере процедура работает. Теперь попробуем её вызвать в клиенте Delphi таким образом.
Построим такого клиента (новое VCL приложение)
В свойстве FDStoredProc1.StoredProcName укажем следующее значение
1 |
FDStoredProc1.StoredProcName:='array_db.SELECT_ALL' |
На кнопке сделаем такой код
1 2 3 4 5 6 |
procedure TForm1.Call_ProcedureClick(Sender: TObject); begin FDStoredProc1.StoredProcName:='array_db.SELECT_ALL'; FDStoredProc1.Open(); //FDStoredProc1.Active:=true; // Также сработает end; |
Результат
Пример хранимой процедуры с входными параметрами
Теперь создадим на сервере простейшую хранимую процедуру с параметрами.
1 2 3 4 5 6 7 8 9 10 |
delimiter // create procedure MyProcWithPar(p1 varchar(10),p2 varchar(10)) begin insert into firsttable (field1,field2,field3,field4,field5) values (p1,p1,p2,p2,p2); end// delimiter ; |
Здесь мы не указали параметры типы параметров, они по умолчанию IN, то есть можно было бы написать
1 2 3 |
... create procedure MyProcWithPar(IN p1 varchar(10),IN p2 varchar(10)) ... |
Добавим и проверим её…
Вроде все на месте, теперь пробуем в клиенте Delphi с помощью FireDAC
Немного преобразим форму, добавив пару компонент и кнопок…
После того как в объектном инспекторе мы выбираем свойство FDStoredProc2.StoredProcName у нас автоматически заполняются параметры процедуры в свойстве FDStoredProc2.Params
1 2 3 4 5 6 7 8 9 10 |
procedure TForm1.CallProcedure2Click(Sender: TObject); begin FDStoredProc2.StoredProcName:='array_db.MyProcWithPar'; FDStoredProc2.ExecProc('MyProcWithPar',['Hello','Wow']); DataSource1.DataSet:=FDQuery1; FDQuery1.Open('select*from firsttable'); end; |
Результат
В принципе множество можно было отображать и внутри хранимой процедуры. Но для демонстрации метода ExecProc я решил поступить именно таким образом, разделив выполнение процедуры и отображение множества.
Пример хранимой процедуры с выходным параметром
1 2 3 4 5 6 7 8 9 |
DELIMITER $$ DROP PROCEDURE IF EXISTS my_sqrt$$ CREATE PROCEDURE my_sqrt(IN input_number INT, OUT out_number FLOAT) BEGIN SET out_number=SQRT(input_number); END$$ DELIMITER ; |
Тестируем в консоли…
Тестируем в Delphi, добавим пару компонентов на форму
Теперь код на кнопке call_sqrt
1 2 3 4 5 6 7 8 |
procedure TForm1.call_sqrtClick(Sender: TObject); begin FDStoredProc3.ExecProc('array_db.my_sqrt',[15]); // << Отправляем только IN параметр (входной) showmessage( FDStoredProc3.Params.ParamByName('out_number').Value ); end; |
Результат
Пример хранимой процедуры с INOUT параметрами
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
drop procedure if exists plus; DELIMITER // create procedure plus(inout result int, in a int, in b int) begin set result=a+b; end // DELIMITER ; select name from mysql.proc where db='test_db'; |
Добавление и тестирование в консоли MySQL
Процедура с множественными выходными параметрами
Создадим калькулятор суммы и умножения таким образом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
drop procedure if exists mycalc; DELIMITER // create procedure mycalc(inout summ int,inout mult int, in a int, in b int) begin set summ=a+b; set mult=a*b; end // DELIMITER ; select name from mysql.proc where db='test_db'; set @mysumm=1; set @mymult=1; call mycalc(@mysumm,@mymult,2,5); select @mysumm,@mymult; |
Результат в консоли MySQL будет таким…
Как видно, мы можем использовать несколько исходящих параметров одновременно.