<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF77%3APHP</id>
		<title>LXF77:PHP - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF77%3APHP"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF77:PHP&amp;action=history"/>
		<updated>2026-05-13T09:06:30Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF77:PHP&amp;diff=5910&amp;oldid=prev</id>
		<title>Yaleks: викификация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF77:PHP&amp;diff=5910&amp;oldid=prev"/>
				<updated>2008-12-11T09:50:05Z</updated>
		
		<summary type="html">&lt;p&gt;викификация&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 09:50, 11 декабря 2008&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/PHP}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/PHP}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== PHP: Хранимые процедуры ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== PHP: Хранимые процедуры ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''часть 2 Как будто нам недостаточно изучения SQL! MySQL 5.0 приносит с собой ещё и новый способ программирования. Специалист по базам данным '''Пол Хадсон''' (Paul Hudson) представляет хранимые процедуры.''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''часть 2 Как будто нам недостаточно изучения SQL! MySQL 5.0 приносит с собой ещё и новый способ программирования. Специалист по базам данным '''Пол Хадсон''' (Paul Hudson) представляет хранимые процедуры.''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 29:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 30:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;лучший язык программирования. Да, как правило, он лучший, но кроме него существует ещё и множество других,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;лучший язык программирования. Да, как правило, он лучший, но кроме него существует ещё и множество других,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходящих в каждой конкретной ситуации. А при использовании&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходящих в каждой конкретной ситуации. А при использовании&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нескольких языков одновременно сразу же возникает &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;вопрос – &lt;/del&gt;как&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нескольких языков одновременно сразу же возникает &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;вопрос — &lt;/ins&gt;как&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;правильно взаимодействовать с базой данных. Возможно, вы мне не&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;правильно взаимодействовать с базой данных. Возможно, вы мне не&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;поверите, но с MySQL 5.0 такой проблемы не существует.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;поверите, но с MySQL 5.0 такой проблемы не существует.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 44:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 45:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Теперь у нас появилось решение! Вам больше не нужно думать о&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Теперь у нас появилось решение! Вам больше не нужно думать о&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;том, чтобы помногу раз копировать тысячи строк SQL-кода. Поддержка&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;том, чтобы помногу раз копировать тысячи строк SQL-кода. Поддержка&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;множества копий одного и того же &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;запроса – &lt;/del&gt;это жуткий кошмар, тысячи человеко-часов и питательная среда для ошибок. Нет, самым&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;множества копий одного и того же &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;запроса — &lt;/ins&gt;это жуткий кошмар, тысячи человеко-часов и питательная среда для ошибок. Нет, самым&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;лучшим вариантом было бы сохранить SQL прямо в базе данных и в&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;лучшим вариантом было бы сохранить SQL прямо в базе данных и в&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;дальнейшем вызывать его изо всех приложений. Вместо того, чтобы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;дальнейшем вызывать его изо всех приложений. Вместо того, чтобы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 62:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 63:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;ваш арсенал администратора базы данных. В предыдущем номере мы с&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;ваш арсенал администратора базы данных. В предыдущем номере мы с&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вами рассматривали, как создавать и использовать триггеры на таблицах,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вами рассматривали, как создавать и использовать триггеры на таблицах,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;так что теперь вы умеете наблюдать за выполняемыми запросами и контролировать их. Хорошая новость: &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;триггеры – &lt;/del&gt;это не более чем хранимые&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;так что теперь вы умеете наблюдать за выполняемыми запросами и контролировать их. Хорошая новость: &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;триггеры — &lt;/ins&gt;это не более чем хранимые&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;процедуры, разработанные для запуска в специфические моменты. Таким&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;процедуры, разработанные для запуска в специфические моменты. Таким&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;образом, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;триггеры – &lt;/del&gt;это подмножество хранимых процедур, не позволяющее получать и передавать ваши переменные. Так что если вы изучили&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;образом, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;триггеры — &lt;/ins&gt;это подмножество хранимых процедур, не позволяющее получать и передавать ваши переменные. Так что если вы изучили&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;учебник из февральского номера, у вас уже есть фора.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;учебник из февральского номера, у вас уже есть фора.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 75:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 76:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Процедура будет менять возраст пользователя с заданным именем,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Процедура будет менять возраст пользователя с заданным именем,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;делая его на год старше. Как и с триггерами, нам потребуется изменить&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;делая его на год старше. Как и с триггерами, нам потребуется изменить&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;разделитель команд с ; на // для того, чтобы ввести многострочную процедуру как единое целое.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;разделитель команд с; на // для того, чтобы ввести многострочную процедуру как единое целое.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Итак:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Итак:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 98:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 99:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;процедуры они не нужны. Как видите, get_older() работает именно&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;процедуры они не нужны. Как видите, get_older() работает именно&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;так, как вы ожидали, и её достаточно просто использовать. Если вас&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;так, как вы ожидали, и её достаточно просто использовать. Если вас&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интересует, что будет, если передать параметр, который не является VARCHAR(255), то ответ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;прост – &lt;/del&gt;MySQL преобразует его к типу&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интересует, что будет, если передать параметр, который не является VARCHAR(255), то ответ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;прост — &lt;/ins&gt;MySQL преобразует его к типу&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;VARCHAR.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;VARCHAR.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 120:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 121:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;бы получены.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;бы получены.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Второй способ вернуть данные из &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;процедуры – &lt;/del&gt;это использование&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Второй способ вернуть данные из &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;процедуры — &lt;/ins&gt;это использование&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;выходных (OUT) параметров. До сих пор мы помечали все параметры&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;выходных (OUT) параметров. До сих пор мы помечали все параметры&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;как IN, что на самом деле не обязательно, поскольку MySQL считает все&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;как IN, что на самом деле не обязательно, поскольку MySQL считает все&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 160:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 161:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как Pascal или Fortran, MySQL различает процедуры и функции.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как Pascal или Fortran, MySQL различает процедуры и функции.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Первые – &lt;/del&gt;это команды, а &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;вторые – &lt;/del&gt;запросы. Если вы изучали компьютерные науки, то вам должно быть знакомо понятие «Command-Query&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Первые — &lt;/ins&gt;это команды, а &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;вторые — &lt;/ins&gt;запросы. Если вы изучали компьютерные науки, то вам должно быть знакомо понятие «Command-Query&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Separation”&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Separation»&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В MySQL процедуры не могут быть вызваны inline, и хотя они умеют&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В MySQL процедуры не могут быть вызваны inline, и хотя они умеют&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;возвращать значения при помощи OUT-переменных, вам потребуется&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;возвращать значения при помощи OUT-переменных, вам потребуется&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;выполнить ещё один запрос, чтобы прочитать их. Альтернативный &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;вариант - &lt;/del&gt;использовать функции, разработанные так, что их можно вызывать&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;выполнить ещё один запрос, чтобы прочитать их. Альтернативный &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;вариант — &lt;/ins&gt;использовать функции, разработанные так, что их можно вызывать&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;как часть более длинного SQL-запроса, наподобие встроенных функций&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;как часть более длинного SQL-запроса, наподобие встроенных функций&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;MIN() и MAX(). Чтобы протестировать, как это работает, давайте добавим две следующие строчки в таблицу users:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;MIN() и MAX(). Чтобы протестировать, как это работает, давайте добавим две следующие строчки в таблицу users:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 172:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 173:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Итак, у нас теперь есть Nick и Tanya старше 40 лет, плюс William&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Итак, у нас теперь есть Nick и Tanya старше 40 лет, плюс William&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;и ещё один Nick моложе сорока. Мы могли бы отфильтровать его по&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;и ещё один Nick моложе сорока. Мы могли бы отфильтровать его по&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;условию &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“WHERE &lt;/del&gt;Age &amp;gt; &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;40”&lt;/del&gt;, но в демонстрационных целях сделаем это при помощи хранимой процедуры age_over_40(). Вот как это&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;условию &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;«WHERE &lt;/ins&gt;Age &amp;gt; &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;40»&lt;/ins&gt;, но в демонстрационных целях сделаем это при помощи хранимой процедуры age_over_40(). Вот как это&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;будет выглядеть:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;будет выглядеть:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 187:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 188:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Этот пример немного отличается от приведённого выше, так что&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Этот пример немного отличается от приведённого выше, так что&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;давайте рассмотрим, в чём разница. Во-первых, теперь нет никаких IN&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;давайте рассмотрим, в чём разница. Во-первых, теперь нет никаких IN&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;или &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;OUT – &lt;/del&gt;все параметры функции являются входными. Но зато теперь&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;или &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;OUT — &lt;/ins&gt;все параметры функции являются входными. Но зато теперь&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;мы должны определить возвращаемое значение при помощи оператора&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;мы должны определить возвращаемое значение при помощи оператора&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;RETURN. В нашем примере мы возвращаем логическую (Boolean) переменную, которая может принимать значения True или False. Внутри функции мы с вами впервые использовали условный оператор, и проверили,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;RETURN. В нашем примере мы возвращаем логическую (Boolean) переменную, которая может принимать значения True или False. Внутри функции мы с вами впервые использовали условный оператор, и проверили,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;превышает ли значение переданного нам параметра 40. Если да, то мы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;превышает ли значение переданного нам параметра 40. Если да, то мы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;возвращаем true, если &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;нет – &lt;/del&gt;то false. Просто!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;возвращаем true, если &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;нет — &lt;/ins&gt;то false. Просто!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Самая потрясающая вещь в &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;функциях – &lt;/del&gt;это то, что их можно использовать как часть обычных SQL-запросов, например, вот так:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Самая потрясающая вещь в &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;функциях — &lt;/ins&gt;это то, что их можно использовать как часть обычных SQL-запросов, например, вот так:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT Name FROM users WHERE age_over_40(Age);&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT Name FROM users WHERE age_over_40(Age);&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Этот запрос вернёт все значения Name из таблицы Users, для&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Этот запрос вернёт все значения Name из таблицы Users, для&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;которых функция age_over_40() вернула значение true. Представьте&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;которых функция age_over_40() вернула значение true. Представьте&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;всё богатство &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;возможностей – &lt;/del&gt;вы можете запросить несколько таблиц,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;всё богатство &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;возможностей — &lt;/ins&gt;вы можете запросить несколько таблиц,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;написать сложные вложенные условия с множеством проверок, и так&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;написать сложные вложенные условия с множеством проверок, и так&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;далее... &lt;/del&gt;Если вам нужны более сложные проверки, возможно, вам больше подойдёт оператор CASE:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;далее… &lt;/ins&gt;Если вам нужны более сложные проверки, возможно, вам больше подойдёт оператор CASE:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;CREATE FUNCTION describe_name (pName VARCHAR(255))&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;CREATE FUNCTION describe_name (pName VARCHAR(255))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF77:PHP&amp;diff=5909&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/PHP}} == PHP: Хранимые процедуры == ''часть 2 Как будто нам недостаточно изучения SQL! MySQL 5.0 приносит с со...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF77:PHP&amp;diff=5909&amp;oldid=prev"/>
				<updated>2008-12-11T09:49:34Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/PHP}} == PHP: Хранимые процедуры == &amp;#039;&amp;#039;часть 2 Как будто нам недостаточно изучения SQL! MySQL 5.0 приносит с со...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/PHP}}&lt;br /&gt;
== PHP: Хранимые процедуры ==&lt;br /&gt;
''часть 2 Как будто нам недостаточно изучения SQL! MySQL 5.0 приносит с собой ещё и новый способ программирования. Специалист по базам данным '''Пол Хадсон''' (Paul Hudson) представляет хранимые процедуры.''&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=где тут хранимые процедуры ?&lt;br /&gt;
|Содержание=Новые возможности MySQL 5.0 позволяют создавать&lt;br /&gt;
хранимые процедуры, используя диалект SQL под&lt;br /&gt;
названием SQL:2003. Сейчас идёт работа по созданию&lt;br /&gt;
системы подключаемых хранимых процедур, которая&lt;br /&gt;
представляет собой открытый API, позволяющий&lt;br /&gt;
разрабатывать хранимые процедуры на любом языке&lt;br /&gt;
программирования.&lt;br /&gt;
&lt;br /&gt;
Разработчики MySQL утверждают, что, скорее всего&lt;br /&gt;
одним из первых поддерживаемых языков&lt;br /&gt;
программирования будет PHP (Урааа!), поскольку он&lt;br /&gt;
разработан так, что его довольно просто внедрять. Если&lt;br /&gt;
они справятся с этой задачей, мы сможем из сценариев&lt;br /&gt;
на PHP вызывать хранимые процедуры MySQL, которые в&lt;br /&gt;
свою очередь написаны на PHP. Они смогут выполнять&lt;br /&gt;
обратные вызовы к базе данных и выполнять серьёзную&lt;br /&gt;
обработку перед тем, как вернуть окончательный&lt;br /&gt;
результат. Если вас напрягает, что какой-то язык X не&lt;br /&gt;
умеет делать что-то, что умеет PHP, то такие хранимые&lt;br /&gt;
процедуры могут стать решением вашей проблемы...&lt;br /&gt;
|Ширина=200px}}&lt;br /&gt;
Я хотел бы сделать важное заявление: PHP не всегда самый&lt;br /&gt;
лучший язык программирования. Да, как правило, он лучший, но кроме него существует ещё и множество других,&lt;br /&gt;
подходящих в каждой конкретной ситуации. А при использовании&lt;br /&gt;
нескольких языков одновременно сразу же возникает вопрос – как&lt;br /&gt;
правильно взаимодействовать с базой данных. Возможно, вы мне не&lt;br /&gt;
поверите, но с MySQL 5.0 такой проблемы не существует.&lt;br /&gt;
&lt;br /&gt;
Условия задачи таковы: не важно, какой язык программирования&lt;br /&gt;
вы используете, информация в базе данных должна быть одна и та&lt;br /&gt;
же. Если вы работаете с базой данных вашей коллекции компакт-дисков, скорее всего, вам не придётся особенно заботиться о методах&lt;br /&gt;
доступа к информации, достаточно просто прочитать несколько строк&lt;br /&gt;
и, возможно, сделать некоторые изменения. Но если вы разрабатываете приложения для работы с банковской базой данных, то просто&lt;br /&gt;
необходимо всегда следовать строгим правилам, выполнять все необходимые проверки, вести исчерпывающий журнал всех действий и так&lt;br /&gt;
далее. Очень сложно контролировать соблюдение всех этих правил в&lt;br /&gt;
среде, оперирующей различными языками программирования.&lt;br /&gt;
&lt;br /&gt;
Теперь у нас появилось решение! Вам больше не нужно думать о&lt;br /&gt;
том, чтобы помногу раз копировать тысячи строк SQL-кода. Поддержка&lt;br /&gt;
множества копий одного и того же запроса – это жуткий кошмар, тысячи человеко-часов и питательная среда для ошибок. Нет, самым&lt;br /&gt;
лучшим вариантом было бы сохранить SQL прямо в базе данных и в&lt;br /&gt;
дальнейшем вызывать его изо всех приложений. Вместо того, чтобы&lt;br /&gt;
поддерживать код, который загружает информацию о пользователе&lt;br /&gt;
50235, выполняет нужные изменения и сохраняет запись о них в&lt;br /&gt;
журнале, гораздо лучше записать всю последовательность действий&lt;br /&gt;
в базу данных в виде функции и затем вызывать её примерно так:&lt;br /&gt;
updateuser(50235). При использовании этого метода код на любом&lt;br /&gt;
языке программирования вообще не должен знать, что требуется&lt;br /&gt;
сохранять что-то в журнале, не говоря уж о том, что именно надо туда&lt;br /&gt;
записывать: база данных сама позаботится об этом. Если же правила&lt;br /&gt;
затем изменятся, вам потребуется внести изменения в базу данных и&lt;br /&gt;
никуда больше, вместо того чтобы править сотни файлов на разных&lt;br /&gt;
языках программирования.&lt;br /&gt;
&lt;br /&gt;
Это решение известно как хранимые процедуры. Если вы найдёте время на то, чтобы выучить их синтаксис, то получите ценное приобретение в&lt;br /&gt;
ваш арсенал администратора базы данных. В предыдущем номере мы с&lt;br /&gt;
вами рассматривали, как создавать и использовать триггеры на таблицах,&lt;br /&gt;
так что теперь вы умеете наблюдать за выполняемыми запросами и контролировать их. Хорошая новость: триггеры – это не более чем хранимые&lt;br /&gt;
процедуры, разработанные для запуска в специфические моменты. Таким&lt;br /&gt;
образом, триггеры – это подмножество хранимых процедур, не позволяющее получать и передавать ваши переменные. Так что если вы изучили&lt;br /&gt;
учебник из февральского номера, у вас уже есть фора.&lt;br /&gt;
&lt;br /&gt;
=== Следующие процедуры ===&lt;br /&gt;
Давайте рассмотрим простую хранимую процедуру, которая умеет&lt;br /&gt;
обновлять возраст пользователя. Для начала создадим таблицу пользователей, примерно вот так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE users (ID INT NOT NULL AUTO_INCREMENT PRIMARY&lt;br /&gt;
KEY, Name VARCHAR(255), Age TINYINT UNSIGNED);&lt;br /&gt;
INSERT INTO users (Name, Age) VALUES ('Nick', 44);&amp;lt;/source&amp;gt;&lt;br /&gt;
Процедура будет менять возраст пользователя с заданным именем,&lt;br /&gt;
делая его на год старше. Как и с триггерами, нам потребуется изменить&lt;br /&gt;
разделитель команд с ; на // для того, чтобы ввести многострочную процедуру как единое целое.&lt;br /&gt;
&lt;br /&gt;
Итак:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;br /&gt;
CREATE PROCEDURE get_older (IN pName VARCHAR(255))&lt;br /&gt;
BEGIN&lt;br /&gt;
UPDATE users SET Age = Age + 1 WHERE Name = pName;&lt;br /&gt;
END//&lt;br /&gt;
DELIMITER ;&amp;lt;/source&amp;gt;&lt;br /&gt;
После смены разделителя мы создаём процедуру get_older и объявляем, что она принимает параметр типа VARCHAR(255) под названием pName. Обратите внимание, параметры BEGIN и END используются&lt;br /&gt;
для определения границ процедуры, но их можно опускать, если процедура состоит из одной единственной строки (как у нас). Наша процедура&lt;br /&gt;
обновляет все строки в таблице, удовлетворяющие указанному условию&lt;br /&gt;
(зависящему от значения параметра), увеличивая значение поля age на&lt;br /&gt;
единицу. В конце определения процедуры мы возвращаем определение&lt;br /&gt;
разделителя к стандартному значению.&lt;br /&gt;
&lt;br /&gt;
Как вызвать нашу процедуру? Нет ничего проще.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT * FROM users;&lt;br /&gt;
CALL get_older('Nick');&lt;br /&gt;
SELECT * FROM users;&amp;lt;/source&amp;gt;&lt;br /&gt;
Два оператора SELECT нужны для того, чтобы увидеть, как изменилось значение Age после вызова get_older(), для работы хранимой&lt;br /&gt;
процедуры они не нужны. Как видите, get_older() работает именно&lt;br /&gt;
так, как вы ожидали, и её достаточно просто использовать. Если вас&lt;br /&gt;
интересует, что будет, если передать параметр, который не является VARCHAR(255), то ответ прост – MySQL преобразует его к типу&lt;br /&gt;
VARCHAR.&lt;br /&gt;
&lt;br /&gt;
=== Чтение данных ===&lt;br /&gt;
Переместимся в более сложные области и добавим ещё одного пользователя в нашу таблицу:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;INSERT INTO users (Name, Age) VALUES ('Nick', 32);&lt;br /&gt;
SELECT * FROM users;&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь у нас есть два Ника, с ID равным 1 и 2. Мы можем создать&lt;br /&gt;
хранимую процедуру для возвращения значений из запроса SELECT&lt;br /&gt;
очень простым способом.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;br /&gt;
CREATE PROCEDURE get_user (IN pID VARCHAR(255))&lt;br /&gt;
BEGIN&lt;br /&gt;
SELECT * FROM users WHERE ID = pID;&lt;br /&gt;
END//&lt;br /&gt;
DELIMITER ;&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь используется та же самая идея, за тем исключением, что&lt;br /&gt;
мы указываем ID для точного определения пользователя и используем оператор SELECT, чтобы извлечь информацию из таблицы. Вызов&lt;br /&gt;
get_user() в данном случае возвратит одну строку, но если бы так&lt;br /&gt;
случилось, что к условию подошли бы несколько строк, то все они были&lt;br /&gt;
бы получены.&lt;br /&gt;
&lt;br /&gt;
Второй способ вернуть данные из процедуры – это использование&lt;br /&gt;
выходных (OUT) параметров. До сих пор мы помечали все параметры&lt;br /&gt;
как IN, что на самом деле не обязательно, поскольку MySQL считает все&lt;br /&gt;
параметры входящими по умолчанию. Если вы когда-нибудь использовали CORBA, COM+ или D-BUS, то понятие OUT-параметров вам знакомо. Если же нет, то всё станет очевидно после следующего примера.&lt;br /&gt;
Давайте попробуем вернуть значение из процедуры при помощи выходного параметра:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;br /&gt;
CREATE PROCEDURE get_user (IN pName VARCHAR(255),&lt;br /&gt;
OUT pID INT)&lt;br /&gt;
BEGIN&lt;br /&gt;
SELECT ID FROM users WHERE Name = pName LIMIT 1&lt;br /&gt;
INTO pID;&lt;br /&gt;
END//&lt;br /&gt;
DELIMITER ;&amp;lt;/source&amp;gt;&lt;br /&gt;
Важным является тот момент, что мы немного изменили работу&lt;br /&gt;
запроса, добавив оператор LIMIT 1. Он потребовался по той причине,&lt;br /&gt;
что в качестве OUT-параметра мы можем вернуть одно и только одно&lt;br /&gt;
значение, и если SQL-запрос вдруг вернёт несколько строк, то произойдёт ошибка. Вызов этой процедуры немного отличается от приведённого&lt;br /&gt;
выше, так как нам надо передать два параметра, один из которых является переменной SQL и может быть опрошен позднее. Итак:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;mysql&amp;gt; CALL get_user('Nick', @ID);&lt;br /&gt;
Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;
mysql&amp;gt; SELECT @ID;&lt;br /&gt;
+------+&lt;br /&gt;
| @ID |&lt;br /&gt;
+------+&lt;br /&gt;
| 1 |&lt;br /&gt;
+------+&lt;br /&gt;
1 row in set (0.00 sec)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inline-функции ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Подсказки&lt;br /&gt;
|Содержание=&lt;br /&gt;
* Если вам нужно вернуть несколько значений сразу, то вы можете использовать столько OUT-параметров, сколько хотите. Для этого просто напишите оператор SELECT ... INTO и укажите в нём список из всех переменных, например “INTO foo, bar”.&lt;br /&gt;
* Создавать функции с именам функций, уже существующих в MySQL – это не очень хорошая идея. Кроме того, у вас возникнут проблемы, если имена переменных совпадут с названиями таблиц или отдельных полей в них.&lt;br /&gt;
* Система преобразования типов MySQL может успешно преобразовать друг в друга переменные почти всех типов данных, так что если ваша хранимая процедура ожидает параметр типа VARCHAR(255), а вы передадите ей CHAR(50), то никаких вопросов не возникнет. Но не забывайте, что любое преобразование типов сказывается на производительности, поэтому почему бы всегда не передавать процедурам именно то, что вы и планировали им передавать с самого начала?&lt;br /&gt;
|Ширина=250px}}&lt;br /&gt;
Процедуры хорошо работают, если вам нужно изменить несколько&lt;br /&gt;
вещей одной строкой кода, но из них очень неудобно возвращать значения переменных.&lt;br /&gt;
&lt;br /&gt;
Как Pascal или Fortran, MySQL различает процедуры и функции.&lt;br /&gt;
Первые – это команды, а вторые – запросы. Если вы изучали компьютерные науки, то вам должно быть знакомо понятие «Command-Query&lt;br /&gt;
Separation”.&lt;br /&gt;
&lt;br /&gt;
В MySQL процедуры не могут быть вызваны inline, и хотя они умеют&lt;br /&gt;
возвращать значения при помощи OUT-переменных, вам потребуется&lt;br /&gt;
выполнить ещё один запрос, чтобы прочитать их. Альтернативный вариант - использовать функции, разработанные так, что их можно вызывать&lt;br /&gt;
как часть более длинного SQL-запроса, наподобие встроенных функций&lt;br /&gt;
MIN() и MAX(). Чтобы протестировать, как это работает, давайте добавим две следующие строчки в таблицу users:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;INSERT INTO users (Name, Age) VALUES ('Tanya', 45);&lt;br /&gt;
INSERT INTO users (Name, Age) VALUES ('William', 39);&amp;lt;/source&amp;gt;&lt;br /&gt;
Итак, у нас теперь есть Nick и Tanya старше 40 лет, плюс William&lt;br /&gt;
и ещё один Nick моложе сорока. Мы могли бы отфильтровать его по&lt;br /&gt;
условию “WHERE Age &amp;gt; 40”, но в демонстрационных целях сделаем это при помощи хранимой процедуры age_over_40(). Вот как это&lt;br /&gt;
будет выглядеть:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;br /&gt;
CREATE FUNCTION age_over_40 (pAge INT) RETURNS&lt;br /&gt;
BOOLEAN&lt;br /&gt;
BEGIN&lt;br /&gt;
IF pAge &amp;gt; 40 THEN&lt;br /&gt;
RETURN TRUE;&lt;br /&gt;
ELSE&lt;br /&gt;
RETURN FALSE;&lt;br /&gt;
END IF;&lt;br /&gt;
END//&lt;br /&gt;
DELIMITER ;&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот пример немного отличается от приведённого выше, так что&lt;br /&gt;
давайте рассмотрим, в чём разница. Во-первых, теперь нет никаких IN&lt;br /&gt;
или OUT – все параметры функции являются входными. Но зато теперь&lt;br /&gt;
мы должны определить возвращаемое значение при помощи оператора&lt;br /&gt;
RETURN. В нашем примере мы возвращаем логическую (Boolean) переменную, которая может принимать значения True или False. Внутри функции мы с вами впервые использовали условный оператор, и проверили,&lt;br /&gt;
превышает ли значение переданного нам параметра 40. Если да, то мы&lt;br /&gt;
возвращаем true, если нет – то false. Просто!&lt;br /&gt;
&lt;br /&gt;
Самая потрясающая вещь в функциях – это то, что их можно использовать как часть обычных SQL-запросов, например, вот так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;SELECT Name FROM users WHERE age_over_40(Age);&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот запрос вернёт все значения Name из таблицы Users, для&lt;br /&gt;
которых функция age_over_40() вернула значение true. Представьте&lt;br /&gt;
всё богатство возможностей – вы можете запросить несколько таблиц,&lt;br /&gt;
написать сложные вложенные условия с множеством проверок, и так&lt;br /&gt;
далее... Если вам нужны более сложные проверки, возможно, вам больше подойдёт оператор CASE:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;DELIMITER //&lt;br /&gt;
CREATE FUNCTION describe_name (pName VARCHAR(255))&lt;br /&gt;
RETURNS VARCHAR(255)&lt;br /&gt;
BEGIN&lt;br /&gt;
CASE pName&lt;br /&gt;
WHEN 'Nick' THEN RETURN 'Short for Nicholas';&lt;br /&gt;
WHEN 'William' THEN RETURN 'Often shortened to Will or&lt;br /&gt;
Bill';&lt;br /&gt;
ELSE RETURN 'I’ve never heard of that name!';&lt;br /&gt;
END CASE;&lt;br /&gt;
END//&lt;br /&gt;
DELIMITER ;&amp;lt;/source&amp;gt;&lt;br /&gt;
Для самых продвинутых пользователей существуют циклы, но вам стоит хорошенько подумать, чтобы найти для них&lt;br /&gt;
достойное применение.&lt;br /&gt;
&lt;br /&gt;
Вот и всё, друзья, что я хотел сказать на тему хранимых процедур (и хранимых функций!). Надеюсь, вы увидели, как полезно&lt;br /&gt;
может быть инкапсуляция сложных запросов в однострочное выражение.&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>