Главная > MySQL > Хранимый код MySQL: Prepared Statements

Хранимый код 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;
Categories: MySQL Tags:
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.