Хранимый код MySQL: Prepared Statements
Хранимые процедуры в частях:
Часть 1. Переменные.
Часть 2. Prepared Statements.
Часть 3. Синтаксис хранимого кода
Часть 4. Функции и Процедуры
Часть 5. Триггеры
В MySQL можно предкомпилировать запрос с последующим выполнение его со своими параметрами.
Prepared Statements (Готовые Инструкции)
Операторы обработки готовых инструкций PREPARE, EXECUTE, USING дают возможность создать инстукцию в формате строки и выполнить её. Это можно сравнить с функцией eval() в PHP или JS, но с возможностью безопасной вставки данных.
Например:
mysql: SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql: PREPARE stmt2 FROM @s;
mysql: SET @a = 6;
mysql: SET @b = 8;
mysql: EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
| 10 |
+------------+
mysql: DEALLOCATE PREPARE stmt2;
Синтаксис PREPARE
PREPARE stmt_name FROM preparable_stmt
stmt_name – название готовой инструкции. Учтите, stmt_name не является уже строкой.
preparable_stmt – инстукции в строковом формате.
Синтаксис EXECUTE
EXECUTE stmt_name [USING @var_name [, @var_name] ...]
Выполняет готовую инструкцию. Инстукция USING позволяет вставлять переменные в инструкцию. В этом случае в инстукции ставится «?», который при помощи USING заменятся на переменную. В примере выше, строка готовой инструкции передавалась через переменную, так же допускается следующий вариант:
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
| 5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
Синтаксис DEALLOCATE
{DEALLOCATE | DROP} PREPARE stmt_name
Удаляет ранее созданную готовую инструкцию.
Пример:
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);
mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);
mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a |
+----+
| 4 |
| 8 |
| 11 |
| 32 |
| 80 |
+----+
mysql> DEALLOCATE PREPARE stmt3;
Стандартными запросами можно не ограничиваться и , например, вызвать процедуру
PREPARE stmt1 FROM 'CALL mysq_proc()';
EXECUTE stmt1;