Создание функций mysql. Функции MySQL. Синтаксис создания триггера

Очень часто дизайнеры рисуют макеты с нестандартными элементами форм, т.е. оформление чекбоксов, радиокнопок, инпутов и селектов отличается от того, что рендерит браузер по умолчанию. Таким образом, перед верстальщиком возникает задача кастомизировать оформление, в том числе это касается элементов select.

В статье мы рассмотрим, как изменить внешний вид select-ов. Однако мы будем придерживаться следующей идеологии. Кастомизировать имеет смысла только дефолтное свёрнутое состояние селекта, а оформление выпадающего списка должно оставаться стандартным. Поэтому решение, описанное ниже, не подойдет, если вам требуется сложный выпадающий список, например, с иконками или чекбоксами для каждого option.

С другой стороны такой подход позволяет:

1. Не писать javascript код, который эмулировал бы поведение селектов. Вся логика возлагается на браузер. Плагинов на сегодняшний день очень много, но не часто встретишь такой, который обрабатывал бы все крайние случаи, возникающие у пользователя при взаимодействии с этим контролом. Примером такого крайнего случая может служить автоматический выбор положения выпадающего списка (открытие вниз или вверх).

2. Раз за поведение и оформление выпадающего списка отвечает браузер, то и не требуется писать какое-то отдельное решение для мобильных устройств, которое позволяло бы удобно работать с селектами на тач-устройствах с маленькими экранами. Встроенные нативные селекты сами принимают нужный вид, ведь на мобильных платформах уже всё продумано. Например, пользователи iOS при клике по селекту увидят не ваш кастомный список, а стандартный привычный. Пользователям не нужно будет подстраивать своё поведение под ваш конкретный сайт, его поведение будет таким же как на всех других сайтах. И ему это удобно, а ради него вы и делали сайт.

Итак, как уже было сказано, для оформления select достаточно CSS3 свойств.

Основное свойство, которое позволит изменить внешний вид селекта, это appearance . Оно заставляет какой-либо элемент принять вид того, что вы захотите, например, можно заставить див стать кнопкой. Однако в рамках нашей задачи интересно значение none , которое означает, что к элементу вообще не нужно применять какой-либо стиль. Таким образом, мы сможем убрать специфичный для селекта атрибут - стрелочку вниз справа.

Select { -webkit-appearance: none; -moz-appearance: none; -ms-appearance: none; appearance: none !important; }

Как видно, убрать стрелку не составило труда, теперь остаётся добавить несколько тривиальных CSS-свойств вроде рамки, шрифта и прочего. Здесь конечно же можно добавить и скругление уголков, и тени и прочее, всё как нарисовал дизайнер в макете. Главное выпадающий список остаётся нативным.

Select { background: transparent; display: block; width: 100%; border: 1px solid #a7a7a7; color: #32353a; font-family: 16/Arial, sans-serif; font-size: 16px; line-height: 1.4; font-weight: normal; padding: 7px 10px 7px 10px; height: 36px; vertical-align: top; outline: 0; -webkit-appearance: none; -moz-appearance: none; -ms-appearance: none; appearance: none !important; }

Теперь остаётся добавить фоном стрелку или какую-либо другую иконку. Использовать фон будем, поскольку псевдоэлементы вроде before и after для селекта работать не будут. Для лучшего отображения сайтов на различных устройствах с разным плотностью пикселей, на различных масштабах и т.п. принято использовать SVG иконки. Поэтому с помощью онлайн URL-encoder для SVG сконвертируем иконку в data URI. При этом важно помнить, что тег SVG должен иметь атрибут xmlns="http://www.w3.org/2000/svg" .

Получится следующий результат.

%3Csvg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8"%3E%3Cpath fill="%23000" fill-rule="evenodd" class="cls-1" d="M8,0L4.141,6.993,0.012,0.156Z"/%3E%3C/svg%3E%0A

Поскольку стрелка используется нестандартная, то можно переместить её влево или использовать вместо стрелки любое другое изображение, а можно и вовсе обойтись без иконок.

С приходом CSS3 стало возможным сделать красивый стиль для любого элемента на сайте. Потому что CSS3 даёт широкий спектр возможностей, которые ускоряют процесс разработки дизайна для сайта. Сегодня мы оформим элемент select на CSS. Кто не знает, этот элемент отвечает за выпадающий список на сайте. Многие используют стандартный вид, но его можно изменить, чтобы он подходил по дизайну к Вашему сайту.

Нет ничего лучше, чем увидеть как выглядит список своими глазами:

Скачать

Вот как выглядит этот Select оформленный на CSS:

Похожие статьи на эту тему:

А сейчас опишу процесс установки по шагам этого выпадающего списка или просто Select.

1 шаг. Подключаем необходимые файлы

Всё просто. После того как скачали архив с исходниками оттуда нам будут нужны 2 файла (style.css и select.js — если подключаете первый вариант списка или select_demo2.js — если подключаете второй вариант). Подключаем эти два файла между тегами :

1 2
2 шаг. HTML структура элемента Select

Ничего сверхсложного в структуре нет (да и откуда ему быть, ведь это просто HTML 🙂). Простая форма, внутри которой выпадающий Select с его пунктами:

1 2 3 4 5 6 7 8 9 10 11 12 Страны Великобритании: Пожалуйста, выберите страну: Англия Северная Ирландия Шотландия Уэльс
3 шаг. Добавляем стили для Select CSS

Их немного. Я привожу ниже стили для первого варианта списка. Хочу обратить внимание на пути к изображениям. Их всего два: первое для того, чтобы раскрыть список, а второй — чтобы закрыть. Они выглядят в виде двух стрелочек «вверх» и «вниз» соответственно. Их можно скачать в месте с исходниками, которые находятся в начале статьи:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 .dropcontainer { position : relative ; font-size : 16px ; color : #777 ; } .trigger { color : #777 ; padding : 10px ; font-size : 16px ; width : 50% ; background : #fff url () 98% center no-repeat ; display : block ; border : 1px solid #ccc ; -webkit-box-sizing : border-box; -moz-box-sizing : border-box; box-sizing : border-box; -webkit-transition : all 0.5s ease; -moz-transition : all 0.5s ease; -o-transition : all 0.5s ease; transition : all 0.5s ease; } .trigger :hover { color : #777 ; background : #f5f5f5 url (../images/select-arrow-open.png ) 98% center no-repeat ; } .activetrigger { color : #777 ; padding : 10px ; font-size : 16px ; width : 50% ; background : #f5f5f5 url () 98% center no-repeat ; display : block ; border : 1px solid #ccc ; -webkit-box-sizing : border-box; -moz-box-sizing : border-box; box-sizing : border-box; } .activetrigger :hover { background : #f5f5f5 url (../images/select-arrow-close.png ) 98% center no-repeat ; color : #777 ; } .activetrigger :active { background : #f5f5f5 url (../images/select-arrow-close.png ) 98% center no-repeat ; color : #777 ; } .dropcontainer ul { font-size : 16px ; border : 1px solid #ccc ; border-top : none ; background : #fff ; list-style-type : none ; padding : 10px ; margin : 0 ; width : 50% ; z-index : 100 ; -webkit-box-sizing : border-box; -moz-box-sizing : border-box; box-sizing : border-box; } .dropcontainer ul li { padding : 5px ; -webkit-transition : all 0.5s ease; -moz-transition : all 0.5s ease; -o-transition : all 0.5s ease; transition : all 0.5s ease; } .dropcontainer ul li :hover { background : #f5f5f5 ; outline : none ; } .dropcontainer ul li :first-child { display : none ; } .dropcontainer ul li :last-child { border-bottom : none ; } .dropdownhidden { display : none ; } .dropdownvisible { height : auto ; }

В демо примере стили расположены в папке css . Поэтому когда мы задаем путь к папке с изображениями в пути мы сначала пишем ".. " (две точки), чтобы выйти на один уровень вверх. А затем заходим в папку images .

Сейчас хочу сказать что можно сделать, чтобы не копировать полностью стили для второго варианта списка (который с фиксированной высотой), а изменить одно свойство и получить фиксированный список.

Вам нужно заменить последнее свойство dropdownvisible :

1 2 3 .dropdownvisible { height : auto ; }
1 2 3 4 .dropdownvisible { height : 200px ; overflow-y : scroll ; }

И если не забудете заменить скрипты (смотрите выше что на что менять), то получите следующее:

В каких браузерах этот Select CSS (выпадающий список) работает нормально?
  • ✓ Firefox 24.0, Firefox 25.0, Firefox 26.0
  • ✓ Chrome 29.0, Chrome 30.0, Chrome 31.0
  • ✓ Opera 12.14, Opera 12.15, Opera 12.16
  • ✓ IE 7.0, IE 8.0, IE 9.0, IE 10.0, IE 11.0
  • ✓ Safari 5.1, Safari 6.0, Safari 6.1, Safari 7.0
  • Apple IOS – iPhone 4S, iPhone 5, iPad 2 (5.0), iPad 3 (6.0), iPad Mini
  • ✓ Android – Sony Experia X10, HTC One X, Kindle Fire 2, Google Nexus
Дополнение к уроку — креативный эффект при наведении + ВИДЕО

В дополнение к уроку хочу рассказать как сделать еще один эффект на сайте очень необычным: эффект при наведении. Посмотрите это короткое видео и всё сами увидите.

Вывод

Еще один элемент сайта — Select можно изменить под свой дизайн на CSS и Javascript. Ничего сложного в процессе установки нет, поэтому у Вас всё получится. Также в качестве дополнения к статье Вы получаете креативный способ и видео по установке.

Внимание! Дальнейшее развитие и поддержка плагина остановлены в связи с тем, что теперь он является частью .

Одна из самых неприятных (и я бы даже сказал ужасных) вещей в веб-разработке — это верстка html-форм. К сожалению, не существует единого стандарта отображения элементов форм, независимо от браузера и операционной системы, так же, как и нет возможности произвольно оформить некоторые из этих элементов, используя каскадные таблицы стилей.

Не поддаются полной стилизации следующие элементы html-форм:

  • раскрывающийся список ;
  • флажок ;
  • переключатель .
  • поле для отправки файла .

Как уже понятно из заголовка поста, здесь речь пойдет только про селекты.

Существует немало готовых решений в виде jQuery-плагинов для стилизации раскрывающихся списков. Но я (ввиду того, что ни один из плагинов меня не устроил по тем или иным причинам) решил пойти путем изобретения своего колеса и написал собственный плагин, которым и делюсь в данной статье.

Сразу хочу заметить, что данный плагин не подходит для всех возможных случаев применения селектов (читайте недостатки).

Демонстрация работы плагина

На вы можете посмотреть пример стилизации селектов с помощью моего плагина. Их оформление я сделал без использования изображений.

Достоинства
  • При отключенном JavaScript отображаются стандартные селекты.
  • Небольшой размер скрипта, примерно 4 килобайта.
  • Работает в IE6+ и всех современных десктопных браузерах.
  • Выводится внутристрочно.
  • Легко поддается оформлению через CSS.
  • Позволяет задать максимальную высоту для выпадающего списка (CSS-свойством max-height).
  • Автоматически подстраивает ширину, если она не указана.
  • Поддерживает прокрутку колесом мыши.
  • Имеет «умное позиционирование», т.е. не уходит за видимую часть страницы при открытии списка.
  • Умеет «ловить» нажатие клавиши Tab и переключаться стрелками на клавиатуре.
  • Поддерживает атрибут «disabled».
  • Работает и с динамически добавляемыми/изменяемыми селектами.
Недостатки
  • Не поддерживает атрибут multiple , т.е. не позволяет выбирать несколько пунктов (мультиселект).
  • Не поддерживает группировку элементов списка (тег ).
  • Не поддерживает переключение стрелками на клавиатуре, когда список раскрыт кликом мыши.
Скачать

Плагин недоступен, т.к. он уже не актуален.

jQuery-плагин «SelectBox Styler»

Версия: 1.0.1 | Загрузок: 11103 | Размер: 7 Кб | Последнее обновление: 07.10.2012

Обновления 22.09.2012 Переделал скрипт в плагин (в том числе сделал минимизированный вариант), а также добавил поддержку динамического добавления/изменения селектов. 07.10.2012 Исправлено поведение скрипта при использовании метода onchange у тега . Подключение плагина

Если на сайте еще не подключен jQuery, то добавьте следующую строку перед тегом :

Сразу после jQuery подключите файл со скриптом:

(function($) { $(function() { $("select").selectbox(); }) })(jQuery)

Этот код поместите перед тегом после вышеуказанных файлов.

При динамическом изменении селектов необходимо запустить триггер refresh , например:

(function($) { $(function() { $("button").click(function() { $("select").find("option:nth-child(5)").attr("selected", true); $("select").trigger("refresh"); }) }) })(jQuery)

HTML-код после выполнения плагина

Его структура выглядит следующим образом:

-- Выберите --

  • -- Выберите --
  • Пункт 1
  • Пункт 2
  • Пункт 3
-- Выберите -- Пункт 1 Пункт 2 Пункт 3

CSS-классы, используемые для оформления селекта

Чтобы оформить селекты с помощью CSS, используйте следующие классы:

.selectbox родительский контейнер для всего селекта
.selectbox .select селект в свернутом состоянии
.selectbox.focused .select фокус на селекте, когда нажата клавиша Tab
.selectbox .select .text вложенный тег для свернутого селекта на случай вставки фонового изображения по технике «раздвижных дверей»
.selectbox .trigger правая часть свернутого селекта (условный переключатель)
.selectbox .trigger .arrow вложенный тег для переключателя (стрелка)
.selectbox .dropdown обертка для выпадающего списка
.selectbox .dropdown ul выпадающий список
.selectbox li пункт (опция) селекта
.selectbox li.selected выбранный пункт селекта
.selectbox li.disabled отключенный (недоступный для выбора) пункт селекта
Заключение

Создание подобного скрипта — довольно кропотливое занятие, поскольку приходится учитывать множество различных моментов. Очень надеюсь, что никаких серьезных багов не вылезет. Но, если что, сообщайте в комментариях.

Чтобы иметь возможность работать с этими функциями, вы обязаны скомпилировать РНР с поддержкой MySQL.

Установка

С помощью опции конфигурации --with-mysql вы включаете доступ PHP к БД MySQL. Если вы используете эту опцию без специфицирования пути к MySQL, PHP будет использовать встроенные клиентские библиотеки MySQL. В PHP4 поддержка MySQL всегда включена; Если вы не специфицируете эту опцию конфигурации, используются связанные библиотеки. Пользователи, запускающие другие приложения, которые используют MySQL (например, при запуске PHP 3 и PHP 4 как конкурирующих модулей Аpache, или auth-mysql), всегда должны специфицировать путь к MySQL: --with-mysql=/path/to/mysql . Это заставит PHP использовать клиентские библиотеки, установленные MySQL, исключая любые конфликты.

Установка

Поведение функций MySQL определяется установками в глобальном файле конфигурации php.ini .

Таблица 1. Опции конфигурации MySQLИмя По умолчанию Изменяемая
mysql.allow_persistent "On" PHP_INI_SYSTEM
mysql.max_persistent "-1" PHP_INI_SYSTEM
mysql.max_links "-1" PHP_INI_SYSTEM
mysql.default_port NULL PHP_INI_ALL
mysql.default_socket NULL PHP_INI_ALL
mysql.default_host NULL PHP_INI_ALL
mysql.default_user NULL PHP_INI_ALL
mysql.default_password NULL PHP_INI_ALL

Дополнительные детали и определение констант PHP_INI_* см. в ini_set() .

Вот краткое описание директив конфигурации.

mysql.allow_persistent boolean mysql.max_persistent integer

Максимальное количество постоянных MySQL-соединений на процесс.

mysql.max_links integer

Максимальное количество постоянных MySQL-соединений на процесс, включая постоянные соединения.

mysql.default_port string

Номер порта по умолчанию TCP для использования при соединении с сервером БД, если иной порт не специфицирован. Если порт по умолчанию не специфицирован, значение получается из переменной окружения MYSQL_TCP_PORT , вхождения mysql-tcp в /etc/services или константы времени компиляции MYSQL_PORT , в указанном порядке. Win32 используют только константу MYSQL_PORT .

mysql.default_socket string

Имя сокета по умолчанию для использования при соединении с локальным сервером БД, если иное имя сокета не специфицировано.

mysql.default_host string

Хост сервера по умолчанию для использования при соединении с локальным сервером БД, если другой хост не специфицирован. Не примеряется в режиме safe mode .

mysql.default_user string

Имя пользователя по умолчанию для использования при соединении с сервером БД, если иное имя не специфицировано. Не применяется в режиме safe mode .

mysql.default_password string

Пароль по умолчанию для использования при соединении с сервером БД, если иной пароль не специфицирован. Не применяется в режиме safe mode .

Есть два типа ресурсов, используемых в MySQL-модуле. Первый это идентификатор ссылки для соединения с БД, второй - ресурс, содержащий результат выполнения запроса.

Предопределённые константыТаблица 2. Константы извлечения MySQL Примеры

Данный пример показывает, как соединиться с БД, выполнить запрос/query, напечатать результирующие ряды и отсоединиться от БД MySQL.

Содержание mysql_affected_rows - получает количество рядов, задействованных в предыдущей операции MySQL mysql_change_user - изменяет вошедшего/logged пользователя в активном соединении mysql_character_set_name - возвращает имя набора символов/character set mysql_close - закрывает MySQL-соединение mysql_connect - открывает соединение с MySQL-сервером mysql_create_db - создаёт БД MySQL mysql_data_seek - перемещает внутренний результирующий указатель mysql_db_name - получает результирующие данные mysql_db_query - отправляет MySQL query mysql_drop_db - удаляет БД MySQL mysql_errno - возвращает числовое значение сообщения об ошибке из предыдущей MySQL-операции mysql_error - возвращает текст сообщения об ошибке из предыдущей MySQL-операции mysql_escape_string - мнемонизирует/Escapes строку для использования в mysql_query mysql_fetch_array - извлекает результирующий ряд как ассоциативный массив, числовой массив или оба mysql_fetch_assoc - извлекает результирующий ряд как ассоциативный массив mysql_fetch_field - получает информацию столбца из результата и возвращает как объект mysql_fetch_lengths - получает длину каждого вывода в результате mysql_fetch_object - извлекает результирующий ряд как объект mysql_fetch_row - получает результирующий ряд в перечислимом массиве mysql_field_flags - получает флаги, ассоциированные со специфицированным полем в результате mysql_field_len - возвращает длину специфицированного поля в результате

Внимание! Данная работа построена на основе перевода раздела «17.1. Stored Routines and the Grant Tables» описания ПО MySQL 5.0.19, «Reference Manual. It documents MySQL 5.0 through 5.0.19. Document generated on: 2006-01-23 (revision:995)»
``Сначала прочти все, а потом пробуй примеры"

Хранимые процедуры представляют собой набор команд SQL, которые могут компилироваться и храниться на сервере. Таким образом, вместо того, чтобы хранить часто используемый запрос, клиенты могут ссылаться на соответствующую хранимую процедуру. Это обеспечивает лучшую производительность, поскольку данный запрос должен анализироваться только однажды и уменьшается трафик между сервером и клиентом. Концептуальный уровень можно также повысить за счет создания на сервере библиотеки функций.

Триггер представляет собой хранимую процедуру, которая активизируется при наступлении определенного события. Например, можно задать хранимую процедуру, которая срабатывает каждый раз при удалении записи из транзакционной таблицы - таким образом, обеспечивается автоматическое удаление соответствующего заказчика из таблицы заказчиков, когда все его транзакции удаляются.

Хранимые программы (процедуры и функции) поддерживаются в MySQL 5.0. Хранимые процедуры - набор SQL -выражений, который может быть сохранен на сервере. Как только это сделано, клиенту уже не нужно повторно передавать запрос, а требуется просто вызвать хранимую программу.

Это может быть полезным тогда, когда:

  • многочисленные приложения клиента написаны в разных языках или работают на других платформах, но нужно использовать ту же базу данных операций
  • безопасность на 1 месте

Хранимые процедуры и функции (подпрограммы) могут обеспечить лучшую производительность потому, что меньше информации требуется для пересылки между клиентом и сервером. Выбор увеличивает нагрузку на сервер БД, но снижает затраты на стороне клиента. Используйте это, если много клиентских машин (таких как Веб-серверы) обслуживаются одной или несколькими БД.

Хранимые подпрограммы также позволяют вам использовать библиотеки функций, хранимые в БД сервера. Эта возможность представлена для многих современных языков программирования, которые позволяют вызывать их непосредственно (например, используя классы).

MySQL следует в синтаксисе за SQL:2003 для хранимых процедур, который уже используется в IBM"s DB2.

От слов к делу…

При создании, модификации, удалении хранимых подпрограмм сервер манипулирует с таблицей mysql.proc

Начиная с MySQL 5.0.3 требуются следующие привилегии:

CREATE ROUTINE для создания хранимых процедур

ALTER ROUTINE необходимы для изменения или удаления процедур. Эта привилегия автоматически назначается создателю процедуры (функции)

EXECUTE привилегия потребуется для выполнения подпрограммы. Тем не менее, автоматически назначается создателю процедуры (функции). Также, по умолчанию, SQL SECURITY параметр для подпрограммы DEFINER , который разрешает пользователям, имеющим доступ к БД вызывать подпрограммы, ассоциированные с этой БД.

Синтаксис хранимых процедур и функций

Хранимая подпрограмма представляет собой процедуру или функцию. Хранимые подпрограммы создаются с помощью выражений CREATE PROCEDURE или CREATE FUNCTION . Хранимая подпрограмма вызывается, используя выражение CALL , причем только возвращающие значение переменные используются в качестве выходных. Функция может быть вызвана подобно любой другой функции и может возвращать скалярную величину. Хранимые подпрограммы могут вызывать другие хранимые подпрограммы.

Начиная с MySQL 5.0.1, загруженная процедура или функция связана с конкретной базой данных. Это имеет несколько смыслов:

  • Когда подпрограмма вызывается, то подразумевается, что надо произвести вызов USE db_name (и отменить использование базы, когда подпрограмма завершилась, и база больше не потребуется)
  • Вы можете квалифицировать обычные имена с именем базы данных. Это может быть использовано, чтобы ссылаться на подпрограмму, которая - не в текущей базе данных. Например, для выполнения хранимой процедуры p или функции f которые связаны с БД test , вы можете сказать интерпретатору команд так: CALL test.p() или test.f() .
  • Когда база данных удалена, все загруженные подпрограммы связанные с ней тоже удаляются. В MySQL 5.0.0, загруженные подпрограммы - глобальные и не связанны с базой данных. Они наследуют по умолчанию базу данных из вызывающего оператора. Если USE db_name выполнено в пределах подпрограммы, оригинальная текущая БД будет восстановлена после выхода из подпрограммы (Например текущая БД db_11 , делаем вызов подпрограммы, использующей db_22 , после выхода из подпрограммы остается текущей db_11)

MySQL поддерживает полностью расширения, которые разрешают юзать обычные SELECT выражения (без использования курсоров или локальных переменных) внутри хранимых процедур. Результирующий набор, возвращенный от запроса, а просто отправляется напрямую клиенту. Множественный SELECT запрос генерирует множество результирующих наборов, поэтому клиент должен использовать библиотеку, поддерживающую множественные результирующие наборы.

CREATE PROCEDURE - создать хранимую процедуру.

CREATE FUNCTION - создать хранимую функцию.

Синтаксис:

CREATE PROCEDURE имя_процедуры ([параметр_процедуры[,...]])
[характеристёика...] тело_подпрограммы

CREATE FUNCTION имя_функции ([параметр_функции[,...]])
RETURNS тип
[характеристика...] тело_подпрограммы

параметр_процедуры:
[ IN | OUT | INOUT ] имя_параметра тип
параметр_функции:
имя_параметра тип

тип:
Любой тип данных MySQL

характеристика:
LANGUAGE SQL
| DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT "string"

тело_подпрограммы:
Правильное SQL выражение.

Рассмотрим все на практике.

Сначала создадим хранимую процедуру следующим запросом:

CREATE PROCEDURE `my_proc`(OUT t INTEGER(11))
NOT DETERMINISTIC
SQL SECURITY INVOKER
COMMENT ""
BEGIN
select val1+val2 into "t" from `my` LIMIT 0,1;
END;

Применение выражения LIMIT в этом запросе сделано из соображений того, что не любой клиент способен принять многострочный результирующий набор.

После этого вызовем ее:

CALL my_proc(@a);
SELECT @a;

Для отделения внутреннего запроса от внешнего всегда используют разделитель отличный от обычно (для задания используют команду DELIMITER )

Вот еще один пример с учетом всех требований.

Mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END;
-> //

mysql> delimiter ;
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)

Весь процесс можно пронаблюдать на рисунке ниже:

Триггеры

Поддержка триггеров появилась в MySQL начиная с версии 5.0.2.

Триггер - поименованный объект БД, который ассоциирован с таблицей и активируемый при наступлении определенного события, события связанного с этой таблицей.

Например, нижеприведенный код создает таблицу и INSERT триггер. Триггер суммирует значения, вставляемые в один из столбцов таблицы.

Mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)

Объявим переменную sum и присвоим ей значение 1. После этого при каждой вставке в таблицу account значение этой переменной будет увеличивать согласно вставляемой части.

Замечание . Если значение переменной не инициализировано, то триггер работать не будет!

Синтаксис создания триггера

CREATE

TRIGGER имя_триггера время_триггера событие_срабатывания_триггера
ON имя_таблицы FOR EACH ROW выражение_выполняемое_при_срабатывании_триггера

Если с именем триггера и именем пользователя все понятно сразу, то о «времени триггера» и «событии» поговорим отдельно.

время_триггера

Определяет время свершения действия триггера. BEFORE означает, что триггер выполнится до завершения события срабатывания триггера, а AFTER означает, что после. Например, при вставке записей (см. пример выше) наш триггер срабатывал до фактической вставки записи и вычислял сумму. Такой вариант уместен при предварительном вычислении каких-то дополнительных полей в таблице или параллельной вставке в другую таблицу.

событие_срабатывания_триггера

Здесь все проще. Тут четко обозначается, при каком событии выполняется триггер.

  • INSERT: т.е. при операциях вставки или аналогичных ей выражениях (INSERT, LOAD DATA, и REPLACE)
  • UPDATE: когда сущность (строка) модифицирована
  • DELETE: когда запись удаляется (запросы, содержащие выражения DELETE и/или REPLACE)



Top