В посте про хранимые процедуры мы уже создавали на стороне сервера MySQL хранимую процедуру добавления записи, с обработкой ошибок. В данном посте – создадим такую процедуру снова, и затем, вызовем её из Delphi.
Как создать хранимую процедуру на стороне сервера MySQL?
Код хранимой процедуры с обработкой ошибок и транзакцией на стороне сервера (вводим через консоль MySQL.exe)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
delimiter // create procedure MyProcedure(Myparam_Name varchar(45), MyParam_Sort INT) begin declare exit handler for sqlexception begin rollback; select 'error'; end; start transaction; insert into departments(Name,Sort) values(Myparam_Name,Myparam_Sort); commit; end// |
Как удалить хранимую процедуру?
1 |
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name |
или в нашем примере…
1 |
drop procedure MyProcedure; |
Как вызвать хранимую процедуру из Delphi?
Можно разными путями – отправляя прямой запрос из компонентов SQLConnection или SQLQuery или компонентов множеств Simpledataset и др.
Нужно только следить – возвращает Ваша процедура множество или нет? Если возвращает (например, запрос SELECT) – тогда из simpldataset и других компонентов множеств, и тогда для активации множеств мы используем инструкции Open или Active. Если не возвращает (например INSERT INTO), тогда можно из SQLConncetion или SQLQuery. Ниже я привожу пример через sqlconnection1… и тогда, например, инструкция Exec для SQLStoredProc;
1 |
sqlconnection1.ExecuteDirect('call MyProcedure('NewRecord'),15); |
Другой путь – через специализированный компонент SQLStoredProc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TMainForm.Button6Click(Sender: TObject); begin with SQLStoredProc1 do begin SQLConnection:=sqlconnection1; StoredProcName:='MyProcedure'; ParambyName('Myparam_Name').AsString:='NewRecord'; ParambyName('Myparam_Sort').Asinteger:=15; Prepared:=true; ExecProc; end; simpledataset1.Refresh; end; |