Вот один конкретный недостаток, с которым я столкнулся при использовании отложенной инициализации в MySQL.Все сводится к этой цитате из MySQL docs :
Пользовательские переменные зависят от соединения.
Первое: настройка
Подключитесь к вашей БД (в моем случае MySQL) Затем создайте простую функцию SetBarProperty () , которая устанавливает свойство @ bar ИСКЛЮЧИТЕЛЬНО длязначение передается в функцию.Сама функция просто возвращает переданное ей значение.
$ mysql
mysql> DROP FUNCTION IF EXISTS SetBarProperty;
Query OK, 0 rows affected (0.01 sec)
mysql> DELIMITER $$
mysql> CREATE FUNCTION SetBarProperty( myValue INT(30) )
-> RETURNS INT(30)
-> DETERMINISTIC
-> READS SQL DATA
-> BEGIN
-> SET @bar := myValue;
-> RETURN myValue;
-> END $$
Query OK, 0 rows affected (0.01 sec)
mysql> DELIMITER ;
Теперь, если мы запросим свойство @ bar , оно будет NULL , как и ожидалось.
mysql> SELECT @bar;
+------+
| @bar |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
Опять же, если мы вызовем SetBarProperty (3); результат будет таким, как ожидалось.
mysql> SELECT SetBarProperty(3);
+-------------------+
| SetBarProperty(3) |
+-------------------+
| 3 |
+-------------------+
1 row in set (0.00 sec)
Как вы думаете?
Как вы думаете, что произойдет, если мы вызовем следующий запрос?
SELECT SetBarProperty(4), @bar;
Вы угадали! @ bar - это 4 .
mysql> SELECT SetBarProperty(4), @bar;
+-------------------+------+
| SetBarProperty(4) | @bar |
+-------------------+------+
| 4 | 4 |
+-------------------+------+
1 row in set (0.00 sec)
А теперь сложная часть ...
Отключение от сервера БД (это очень важно):
Ctrl+C
Теперь заново подключитесь и вызовите тот же запрос, что и раньше:
$ mysql
mysql> SELECT SetBarProperty(4), @bar;
+-------------------+------+
| SetBarProperty(4) | @bar |
+-------------------+------+
| 4 | NULL |
+-------------------+------+
1 row in set (0.00 sec)
Вы видели, что только что произошло?
@bar был NULL , и это потому, что он не был инициализирован в пространстве вызывающей функции SetBarProperty () .
Если вы отключились от своегоDB и явно инициализировать свойство ДО вызова функции (которая сама инициализирует ее явность), ваш запрос работает так, как ожидалось:
Ctrl+C
$ mysql
mysql> SET @bar := NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT SetBarProperty(4), @bar;
+-------------------+------+
| SetBarProperty(4) | @bar |
+-------------------+------+
| 4 | 4 |
+-------------------+------+
1 row in set (0.00 sec)
Рекомендация
Если вы сразу используете свойство в запросе, простопосле того, как вы вызвали функцию, которая изменяет то же свойство, вы должны инициализировать свойство перед вызовом функции.
Надеюсь, это поможет!
С уважением,
Конрад