SQL-Ex blog
Подобно большинству систем управления реляционными базами данных, MySQL поддерживает использование хранимых процедур, которые могут вызываться по требованию приложениями, управляемыми данными. Каждая хранимая процедура является именованным объектом базы данных, которая содержит процедурный код, состоящий из одного или более операторов SQL. Когда приложение вызывает хранимую процедуру, MySQL выполняет эти операторы и возвращает результаты в приложение.
Процедурный код может содержать широкий ассортимент операторов, включая язык определения данных (DDL) и язык манипуляции данными (DML). Хранимые процедуры также поддерживают использование входных и выходных параметров, делая их исключительно гибким инструментом для инкапсуляции логики операторов.
Хранимые процедуры дают возможность повторно использовать код, когда это необходимо, помогая упростить разработку приложений и уменьшить ошибки в операторах. Разработчикам не придется писать сложные запросы по каждому требованию приложения, и команде QA не потребуется тратить много времени на проверку запросов при тестировании приложений.
Возможность повторно использовать код сокращает также сетевой трафик, поскольку хранимая процедура может вызываться с помощью единственного оператора CALL, и не важно насколько сложен запрос, заложенный в процедуру. Хранимые процедуры могут также обеспечить более высокую степень безопасности, скрывая структуру базы данных и удаляя ad hoc запросы на уровне приложений.
В этой статье я продемонстрирую как создавать и обновлять хранимые процедуры, а также как вызывать их с помощью оператора CALL. Вы узнаете как построить простые и параметризованные процедуры, которые используют входные и выходные параметры. Как и в предыдущих статьях этой серии, я использую редакцию MySQL Community на компьютере с ОС Windows для построения примеров, которые я создавал в MySQL Workbench, графическим интерфейсом пользователя (GUI), идущим вместе с MySQL Community.
Подготовка среды MySQL
Примеры в этой статье используют базу данных travel, которая уже использовалась для предыдущей статьи о представлениях MySQL. Здесь используются те же таблицы и данные для демонстрации работы с хранимыми процедурами. Если вы делали примеры из предыдущей статьи, у вас уже может быть установлена база данных travel на экземпляре MySQL. Если нет, вы можете использовать следующий скрипт для создания базы данных с таблицами:
DROP DATABASE IF EXISTS travel;
CREATE DATABASE travel;
USE travel;
CREATE TABLE manufacturers (
manufacturer_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
manufacturer VARCHAR(50) NOT NULL,
create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_update TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (manufacturer_id) )
ENGINE=InnoDB AUTO_INCREMENT=1001;
CREATE TABLE airplanes (
plane_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
plane VARCHAR(50) NOT NULL,
manufacturer_id INT UNSIGNED NOT NULL,
engine_type VARCHAR(50) NOT NULL,
engine_count TINYINT NOT NULL,
max_weight MEDIUMINT UNSIGNED NOT NULL,
wingspan DECIMAL(5,2) NOT NULL,
plane_length DECIMAL(5,2) NOT NULL,
parking_area INT GENERATED ALWAYS AS
((wingspan * plane_length)) STORED,
icao_code CHAR(4) NOT NULL,
create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_update TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (plane_id),
CONSTRAINT fk_manufacturer_id FOREIGN KEY (manufacturer_id)
REFERENCES manufacturers (manufacturer_id) )
ENGINE=InnoDB AUTO_INCREMENT=101;
Таблица airplanes содержит внешний ключ, который ссылается на таблицу manufacturers, поэтому следует создавать таблицы в указанном порядке. После создания таблиц вы можете добавить некоторые примерные данные, чтобы вы могли протестировать вашу хранимую процедуру. Для заполнения таблицы выполните следующий оператор INSERT:
INSERT INTO manufacturers (manufacturer)
VALUES ('Airbus'), ('Beechcraft'), ('Piper');
INSERT INTO airplanes
(plane, manufacturer_id, engine_type, engine_count,
max_weight, wingspan, plane_length, icao_code)
VALUES
('A380-800', 1001, 'jet', 4, 1267658, 261.65, 238.62, 'A388'),
('A319neo Sharklet', 1001, 'jet', 2, 166449, 117.45, 111.02, 'A319'),
('ACJ320neo (Corporate Jet version)', 1001, 'jet', 2, 174165, 117.45, 123.27, 'A320'),
('A300-200 (A300-C4-200, F4-200)', 1001, 'jet', 2, 363760, 147.08, 175.50, 'A30B'),
('Beech 390 Premier I, IA, II (Raytheon Premier I)', 1002, 'jet', 2, 12500, 44.50, 46.00, 'PRM1'),
('Beechjet 400 (from/same as MU-300-10 Diamond II)', 1002, 'jet', 2, 15780, 43.50, 48.42, 'BE40'),
('1900D', 1002, 'Turboprop', 2,17120, 57.75, 57.67, 'B190'),
('PA-24-400 Comanche', 1003, 'piston', 1, 3600, 36.00, 24.79, 'PA24'),
('PA-46-600TP Malibu Meridian, M600', 1003, 'Turboprop', 1, 6000, 43.17, 29.60, 'P46T'),
('J-3 Cub', 1003, 'piston', 1, 1220, 38.00, 22.42, 'J3');
Как и в случае с операторами CREATE TABLE, вы должны выполнять операторы INSERT в указанном порядке, чтобы не нарушалось ограничение внешнего ключа на таблице airplanes.
Создание хранимой процедуры MySQL
Для построения хранимой процедуры в MySQL вы должны использовать оператор CREATE PROCEDURE. Для начала откройте новое окно запроса в Workbench и проверьте, что активна требуемая база данных. (Чтобы активировать базу данных, выполните двойной щелчок на базе данных в навигаторе или выполните оператор USE.) Для этого примера вы будете использовать базу данных travel.
При построении оператора CREATE PROCEDURE вы должны дать имя процедуре и указать код SQL, который вы хотите хранить в базе данных. Код может включать единственный оператор SQL, такой как SELECT или UPDATE, или же это может быть составным оператором. Составной оператор — это оператор, который использует синтаксис BEGIN…END, ограничивающего блок одного или более операторов SQL. Блок может включать разнообразные элементы языка, включая операторы DDL и DML, объявления переменных, вложенные блоки или конструкции управления потоком, такие как циклы и условные операторы.
Большинство хранимых процедур используют составной оператор, даже если они включают только единственный оператор SQL. Например, код в следующем операторе CREATE PROCEDURE включает составной оператор с единственным оператором SELECT:
DELIMITER //
CREATE PROCEDURE get_plane_info()
BEGIN
SELECT a.manufacturer_id, m.manufacturer,
COUNT(*) AS plane_count,
ROUND(AVG(a.wingspan), 2) AS avg_span,
ROUND(AVG(a.plane_length), 2) AS avg_length
FROM airplanes a INNER JOIN manufacturers m
ON a.manufacturer_id = m.manufacturer_id
GROUP BY a.manufacturer_id
ORDER BY m.manufacturer;
END//
DELIMITER ;
Пример создает процедуру с именем get_plane_info. Обратите внимание на скобки после имени. Если бы операторы включали входные или выходные параметры, они должны определяться в скобках (это будет обсуждаться ниже). Если вы не включаете параметры, то все равно должны использовать скобки.
Составной оператор определяется синтаксисом BEGIN…END, который заключает единственный оператор SELECT. Сам оператор SELECT соединяет таблицы airplanes и manufacturers, группирует данные по столбцу manufacturer_id в таблице airplanes и вычисляет средние значения wingspan и plane_length для каждого производителя. Оператор также упорядочивает результаты по производителю и выводит для каждого общее число моделей самолетов. (Мы обсудим элементы этого оператора позже в этой серии статей).
Как можно увидеть, создание простой хранимой процедуры весьма несложный процесс. По минимуму вы должны задать имя и тело процедуры. Однако вы без сомнения заметили включение двух операторов DELIMITER, которые окружают определение процедуры.
По умолчанию MySQL использует точку с запятой (;) в качестве разделителя операторов. Это помогает гарантировать, что клиент посылает оператор на сервер целиком, не смешивая его с другими операторами. Однако составной оператор в хранимой процедуре может включать один или более разделителей в добавок к финальному разделителю определения, эти разделители могут вызвать путаницу при передаче оператора CREATE PROCEDURE с клиента на сервер.
Чтобы разрешить эту проблему, MySQL поддерживает использование оператора DELIMITER, который позволяет вам временно изменить разделитель для передачи всего определения процедуры на сервер как единого оператора. В примере выше первый оператор DELIMITER изменяет разделитель на двойной прямой слэш (//), а второй оператор DELIMITER изменяет разделитель обратно на точку с запятой. Временный разделитель затем используется в конце оператора CREATE PROCEDURE (после слова END), но сам оператор SELECT по-прежнему ограничивается разделителем в виде точки с запятой.
Я хочу также отметить, что MySQL Workbench предоставляет инструмент (в форме вкладки) для создания и редактирования хранимых процедур. Этот инструмент похож на тот, который использовался для создания и редактирования представлений. Он предлагает заглушку для построения оператора CREATE PROCEDURE, но предоставляет вам заполнить детали. На рис.1 показана вкладка Stored Procedure, когда она появляется при её первом открытии в Workbench.
Рис.1 Добавление хранимой процедуры с помощью Workbench GUI
Чтобы открыть вкладку Stored Procedure, выберите нужную базу данных в навигаторе, а затем щелкните кнопку создания хранимой процедуры на панели инструментов Workbench. (Кнопка имеет всплывающую подсказку Create a new stored procedure in the active schema in the connected server.) При появлении вкладки Stored Procedure вы можете начинать строить свой оператор. По завершению щелкните Apply. MySQL затем добавит несколько компонент оператора, которые необходимы для создания процедуры. Просмотрите окончательный скрипт, еще раз щелкните Apply, а затем — Finish. Хранимая процедура будет добавлена в соответствующую базу данных.
Вкладка Stored Procedure может оказаться полезной для создания и редактирования хранимой процедуры, поэтому я хочу, чтобы вы о ней знали. Однако я предпочитаю использовать вкладку запроса при работе с хранимой процедурой, поскольку мне кажется, что это проще и экономит время. Поэтому я для примеров в этой статье я буду использовать такой подход.
Проверка созданной новой процедуры
После выполнения оператора CREATE PROCEDURE вы можете проверить, что она была добавлена в базу данных travel, просмотром в навигаторе, как показано на рис.2. (Возможно потребуется обновить навигатор, чтобы увидеть появление новой процедуры.)
Рис.2 Наблюдение хранимой процедуры в навигаторе
Из навигатора вы можете открыть определение процедуры на вкладке Stored Procedure, щелкнув на иконке с изображением гаечного ключа возле имени процедуры. На рис.3 показано определение процедуры в том виде, в котором вы ее создали, с одним отличием. Оно включает предложение DEFINER после ключевого слова CREATE.
Рис.3 Просмотри определения процедуры на вкладке Stored Procedure
Предложение DEFINER указывает, какой аккаунт назначен в качестве создателя процедуры. Поскольку я создал хранимую процедуру под аккаунтом root на моем локальном экземпляре MySQL, это имя добавляется к определению. По умолчанию MySQL использует аккаунт пользователя, который выполнял оператор CREATE PROCEDURE, но вы можете указать отличный аккаунт, если ему предоставлены соответствующие разрешения.
Помимо предложения DEFINER, ваша хранимая процедура должна выглядеть так же, как вы ее создали, за исключением отсутствия операторов DELIMITER или пользовательским разделителем. Однако, если вы обновите определение на вкладке Stored Procedure и щелкните Apply, Workbench добавит эти элементы.
Другим способом проверить создание хранимой процедуры является запрос представления routines в базе данных INFORMATION_SCHEMA:
SELECT * FROM information_schema.routines
WHERE routine_schema = 'travel';
Оператор включает предложение WHERE, которое ограничивает результаты базой данных travel. Любые процедуры (хранимые процедуры или функции), которые были созданы в базе данных будут возвращаться этим запросом.
Вы можете еще больше ограничить результаты, указав имя процедуры в предложении WHERE, а также какие столбцы следует вернуть. Например, следующий оператор SELECT ограничивает результаты столбцом routine_definition и процедурой get_plane_info в базе данных travel:
SELECT routine_definition
FROM information_schema.routines
WHERE routine_schema = 'travel'
AND routine_name = 'get_plane_info';
Хотя оператор возвращает единственное значение, его все же бывает трудно читать, особенно, если это сложный составной оператор. Для просмотра оператора полностью щелкните правой кнопкой на значении прямо в результатах, а затем — Open Value in Viewer (открыть значение в просмотрщике). Выберите Text, если он еще не выбран. MySQL откроет новое окно, в которое выведет значение, как показано на рис.4.
Рис.4 Проверка тела хранимой процедуры в просмотрщике
Конечно, проверка существования процедуры не скажет вам, что она работает как ожидалось. Поэтому вам следует также выполнить процедуру и посмотреть, какие результаты она вернет (в дополнение к выполнению ее в надлежащем цикле QA). Для этого используйте оператор CALL, который указывает имя процедуры, как показано в следующем примере:
CALL get_plane_info;
Когда вы вызываете процедуру, MySQL выполняет сохраненный код и возвращает результаты оператора, которые показаны на рис.5.
Рис.5 Просмотр результатов после вызова хранимой процедуры
Как ожидалось, оператор CALL возвращает агрегрованные данные самолетов, группируя их по производителю. Это те же результаты, которые вы получили бы, если выполнили непосредственно оператор SELECT в процедуре. Однако теперь оператор постоянно присутствует в базе данных, устраняя необходимость писать оператор на уровне приложения.
Добавления входного параметра в процедуру
Хранимая процедура get_plane_info из предыдущего раздела продемонстрировала большинство из основных компонентов, которые имеются в хранимых процедурах MySQL. В производственной среде составной оператор будет, скорее всего, более сложным, но этот пример все же обеспечивает большую часть базовых элементов. Тем не менее, одним из наиболее выгодных аспектов хранимой процедуры является ее возможность поддерживать входные и выходные параметры.
В этом разделе я демонстрирую, как добавить входной параметр в определение процедуры. (О выходных параметрах в следующем разделе.) Прежде, чем двинуться дальше, вы должны знать, что не можете просто изменить определение процедуры, как вы могли это сделать с определением таблицы или представления. Вы можете модифицировать характеристики процедуры, но не более. Чтобы внести более существенные обновления, вы должны удалить процедуру, а затем пересоздать её, добавляя любые новые элементы.
Чтобы удалить хранимыю процедуру, вы можете использовать оператор DROP PROCEDURE, как показано в следующем примере:
DROP PROCEDURE IF EXISTS get_plane_info;
Предложение IF EXISTS не является обязательным, но оно может помочь избежать необязательных ошибок. После выполнения этого оператора вы сможете убедиться, что процедура была удалена, если опять обратиться к представлению routines в базе данных INFORMATION_SCHEMA:
SELECT * FROM information_schema.routines
WHERE routine_schema = 'travel';
Теперь оператор должен вернуть пустой результрующий набор, если вы не создавали других хранимых процедур или функций.
- IN. Входной параметр, который передает значение при вызове в код процедуры.
- OUT. Выходной параметр, который передает значение из кода обратно в вызывающее приложение.
- INOUT. Параметр, который может инициализироваться вызываюим приложением, обновляться в процедуре, а затем возвращаться в вызывающее приложение с новым значением.
DELIMITER //
CREATE PROCEDURE get_plane_info(
IN in_name VARCHAR(50))
COMMENT 'retrieves aggregated airplane information'
BEGIN
SELECT a.manufacturer_id, m.manufacturer,
COUNT(*) AS plane_count,
ROUND(AVG(a.wingspan), 2) AS avg_span,
ROUND(AVG(a.plane_length), 2) AS avg_length
FROM airplanes a INNER JOIN manufacturers m
ON a.manufacturer_id = m.manufacturer_id
WHERE m.manufacturer = in_name;
END//
DELIMITER ;
Определение параметра заключается в круглые скобки и содержит ключевое слово IN, имя параметра тип данных. Я также обновил оператор SELECT, использовав параметр. Он больше не включает предложений GROUP BY и ORDER BY, но включает предложение WHERE, которое сравнивает параметр со столбцом manufacturer. Таким способом вызывающее приложение может указать производителя, на котором основывается запрос.
Оператор CREATE PROCEDURE также включает характеристику COMMENT, которое добавляет комментарий к определению процедуры. Вы можете включить одну или более таких характеристик после определений параметров. Характеристика является одной из нескольких опций, которые могут быть добавлены к определению процедуры. Каждая характеристика влияет на определение процедуры по-разному. Например, эта характеристика добавляет комментарий, но вы можете также использовать характеристики для указания языка процедуры, указать, является ли процедура детерминистической, или определить характер процедуры.
Пр вызове хранимой процедуры, которая принимает входной параметр, вы должны заключить значение параметра в скобки. Если это символьное значение, то нужно заключть его в одинарные кавычки. Например, следующий оператор CALL задает в качестве входного параметра процедуры значение piper:
CALL get_plane_info ('piper');
Когда MySQL выполняет код процедуры, она подставляет значение piper вместо входного параметра in_name, указанного в предложени WHERE. На рис.6 показаны результаты, которые сейчас возвращает хранимая процедура.
Рис.6 Вызов хранимой процедуры с входным параметром
При определении хранимой процедуры вы можете включить несколько параметров IN, разделяя их запятыми. Тогда при вызове процедуры вы задаете значение каждого параметра в скобках, так же разделяя их запятыми. Вы можете также включить параметры OUT или INOUT, наряду с входным параметрами.
Добавление выходных параметров в хранимой процедуре
Давайте теперь посмотрим, как добавить несколько параметров OUT в хранимую процедуру get_plane_info. Выходные параметры обеспечивают механизм возврата одного или более значений обратно в вызывающую программу, а не единственный результирующий набор. В этом примере вы добавите пять выходных параметров, которые будут соответствовать столбцам, указанным в списке SELECT процедуры.
Для добавления параметров вам необходимо опять удалить процедуру, а затем выполнить обновленный оператор CREATE PROCEDURE. Выходные параметры указываются в тех же скобках, что и входные параметры, что показано в следующем скрипте:
DROP PROCEDURE IF EXISTS get_plane_info;
DELIMITER //
CREATE PROCEDURE get_plane_info(
IN in_name VARCHAR(50),
OUT out_id INT UNSIGNED,
OUT out_name VARCHAR(50),
OUT plane_count SMALLINT UNSIGNED,
OUT avg_wingspan DECIMAL(5,2),
OUT avg_length DECIMAL(5,2))
COMMENT 'retrieves aggregated airplane information'
BEGIN
SELECT a.manufacturer_id, m.manufacturer,
COUNT(*),
ROUND(AVG(a.wingspan), 2),
ROUND(AVG(a.plane_length), 2)
INTO out_id, out_name, plane_count, avg_wingspan, avg_length
FROM airplanes a INNER JOIN manufacturers m
ON a.manufacturer_id = m.manufacturer_id
WHERE m.manufacturer = in_name;
END//
DELIMITER ;
Для каждого выходного параметра вы должны указать ключевое слово OUT, имя параметра и тип данных параметра. Кроме того, вы должны добавить предложение INTO после списка SELECT, который возвращает результаты в выходные параметры. Я также удалил алиасы столбцов из списка SELECT, поскольку они больше не нужны.
При вызове хранимой процедуры, которая возвращает выходные параметры, вы можете захватить значения этих параметров, передавая пользовательскую переменную для каждого выходного параметра, которая будет содержать его значение, как показано в следующем операторе CALL:
CALL get_plane_info ('beechcraft', @out_id, @out_name,
@plane_count, @avg_wingspan, @avg_length);
Оператор CALL указывает beechcraft в качестве значения входного параметра. Затем следует пять пользовательских переменных, которые соответствуют параметрам, указанным в определении хранимой процедуры. Когда оператор CALL выполняется, значения возвращаемых параметров присваиваются переменным.
Конкретный способ, которым вы будете обрабатывать выходные параметры в приложени, будет зависеть от используемого языка программирования. Пока же вы можете проверить, что ваши переменные содержат ожидаемые значения, выполнив оператор SELECT, например, такой:
SELECT @out_id, @out_name, @plane_count, @avg_wingspan, @avg_length;
На рис.7 показан результат, который вернул этот оператор SELECT:
Рис.7 Просмотр значений выходных параметров процедуры для самолетов Beechcraft
На рисунке показаны результаты, когда вы вызываете хранимую процедуру со значением входного параметра beechcraft. Если задать другое значение, например, airbus, ваш оператор SELECT должен вернуть совсем другие результаты, что показано на рис.8.
Рис.8 Просмотр значений выходных параметров процедуры для самолетов airbus
Параметры IN и OUT могут сделать хранимые процедуры значительно более гибкими при поддержке приложений, управляемых данными. Вам могут встретиться ситуации, когда вы захотите использовать параметр INOUT. Например, вы можете создать хранимую процедуру, которая содержит что-то типа счетчика. Вы можете использовать параметр INOUT для установки начального значения счетчика, а затем возвращать новое значение счетчика на основе вывода программы.
Изменение хранимой процедуры в MySQL
MySQL поддерживает оператор ALTER PROCEDURE для обновления характеристик процедуры. Вы не можете использовать этот оператор, чтобы внести любые другие изменения в определение процедуры. Вы ограничены только характеристикам. Например, следующий оператор ALTER PROCEDURE добавляет две характеристики в определение хранимой процедуры, но остальная часть процедуры остается неизменной:
ALTER PROCEDURE get_plane_info
READS SQL DATA
SQL SECURITY INVOKER;
Характеристика READS SQL DATA указывает, что процедура включает операторы, которые читают данные. Этот тип характеристики носит только рекомендательный характер и никак не ограничивает код процедуры. Характеристика SQL SECURITY INVOKER указывает, что процедура должна выполняться в контексте безопасности аккаунта пользователя, который вызывает процедуру, а не под аккаунтом того, кто определял процедуру.
После выполнения оператора ALTER PROCEDURE вы можете проверить, что характеристики были добавлены, просмотром определения процедуры на вкладке Stored Procedure, как показано на рис.9.
Рис.9 Просмотр определения процедуры на вкладке Stored Procedure
Обратите внимание, что оператор CREATE PROCEDURE теперь включает три характеристики: две только что добавленных и исходную характеристику COMMENT, которую вы добавили ранее.
Работа с хранимыми процедурами в MySQL
Хранимые процедуры могут предложить большую гибкость, помогая оптимизировать разработку приложений. Однако процедура настолько эффективна, насколько эффективен ее код и содержащиеся операторы SQL. Здесь я показал на примере как создать хранимую процедуру, содержащую единственный оператор SELECT, но вы можете построить процедуры, которые обладают более сложной логикой. Позже в этой серии я продемонстрирую создание более сложных составных операторов, которые вы можете встроить в свои хранимые процедуры или использовать для других типов запросов.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
SQL-Ex blog
Хранимые процедуры SQL: входные и выходные параметры, типы, обработка ошибок и кое-что еще
Добавил Sergey Moiseenko on Суббота, 25 февраля. 2023
Если вы слышали о хранимых процедурах в SQL Server, но точно не знаете, что это такое и как это использовать наилучшим образом, то эта статья даст вам необходимую информацию и позволит начать работать с хранимыми процедурами.
Здесь вы узнаете, что из себя представляет хранимая процедура, как ее создать и применить. Мы поговорим о параметрах хранимой процедуры, входных и выходных, и вкратце обсудим обработку ошибок и безопасность для хранимых процедур.
Что необходимо для выполнения примеров
Примеры в этой статье выполняются к учебной базе данных AdventureWorks. Получив практику на учебной базе данных, вы сможете легко применить эти примеры к вашей базе данных. Как обычно, остерегайтесь экспериментировать с вашей производственной системой.
Что такое хранимая процедура SQL?
В простейшем виде хранимая процедура — это не более чем набор операторов Transact-SQL (T-SQL), который хранится в базе данных и может выполняться при вызове хранимой процедуры по имени. Имя присваивается хранимой процедуре при ее создании. Для краткости хранимую процедуру часто называют хп (SP).
Особенности хранимых процедур
- Хранимые процедуры могут принимать входные параметры.
- Хранимые процедуры могут возвращать выходные параметры.
- Хранимые процедуры содержат программные операторы.
- Хранимые процедуры могут возвращать значение состояния, показывающее успешность или сбой (и почему он произошел).
- Нет ограничения на размер хранимой процедуры
- Имеется четыре типа хранимых процедур:
- Определяемые пользователем
- Временные
- Системные
- Расширенные определяемые пользователем
Определения четырех типов хранимых процедур
Определяемая пользователем хранимая процедура
Наиболее часто используются пользовательские хранимые процедуры. Такая процедура может создаваться в пользовательской базе данных или в любой системной базе данных за исключением базы данных Resource. Мы подробней поговорим о пользовательских хранимых процедурах позже в этой статье и рассмотрим ряд примеров.
Временная хранимая процедура
Временная хранимая процедура — это вид пользовательской хранимой процедуры, которая очень похожа на временные таблицы. Временные хранимые процедуры хранятся в базе данных «tempdb», видной на вкладке «System Databases». Эти временные хранимые процедуры могут использоваться как локальные или глобальные.
Временные локальные хранимые процедуры видны только на текущем подключении пользователя и всегда будут иметь префикс # (знак фунта или хэштега).
Временные глобальные хранимые процедуры видны на любом пользовательском подключении и имеют префикс ## (двойной знак фунта).
Поскольку они являются «временными», эти хранимые процедуры пропадают, когда закрывается подключение SQL.
Системные хранимые процедуры
Вы обнаружите, что довольно часто используете системные хранимые процедуры. Полезно познакомиться с ними, чтобы не изобретать колесо. Эти хранимые процедуры включены по умолчанию в установку SQL Server и всегда будут начинаться с префикса «sys.sp_». Вам могут пригодиться самые распространенные системные хранимые процедуры, включая sys.sp_addUser, sys.sp_addLogin, sys.sp_addRole, sys.sp_change_users_login и т.д.
- Databases (базы данных)
- System Databases (системные базы данных)
- Tempdb
- Programmability (программирование)
- Stored Procedures (хранимые процедуры)
- System Stored Procedures (системные хранимые процедуры)
Расширенные хранимые процедуры пользователя
Расширенные хранимые процедуры пользователя используются для создания внешних процедур на языках типа C, C#, VB и т.д. Они реализуются как DLL, которые SQL Server может загрузить и выполнять динамически.
Однако, согласно Microsoft, расширенные хранимые процедуры пользователя будут удалены из будущих версий SQL Server. Поэтому не рекомендуется использовать их в текущих или будущих разработках. Вам следует запланировать удаление или модификацию приложений, использующих эти хранимые процедуры.
Зачем использовать хранимые процедуры
Хранимые процедуры имеют много преимуществ. Он уменьшают сетевой трафик, поскольку только имя передается по сети от приложения на сервер. Правда, мы можем передавать еще несколько параметров, но передача имени хранимой процедуры и нескольких параметров не так сильно загружает сеть как передача всего кода всякий раз, когда нужно этот код выполнить.
Хранимые процедуры усиливают безопасность. Код в хранимой процедуре определяет, какие действия производятся над объектами базы данных. Это означает, что при всяком вызове хранимой процедуры один и тот же блок кода выполняется одним и тем же способом. Вы не должны беспокоиться об ошибках в коде, повторяя набор одного и того же кода всякий раз, когда вам нужно выполнить его.
Мы можем предоставить пользователям разрешение на использование (вызов) хранимой процедуры или же запретить пользователям ее вызывать. Замечание: пользователь не должен иметь разрешение или доступ к таблице, чтобы вызвать хранимую процедуру, которая будет менять данные в этой таблице. Это позволит пользователям добавлять данные в таблицу для создания записей данных, не имея к ним доступа на просмотр, удаление или изменение любых данных в таблице, помимо тех, на которые вы дали им разрешения.
Создав хранимую процедуру, вы выполняете ее, создается план выполнения запроса, который сохраняется и повторно используется. Если вы создаете базисный шаблон вашего кода SQL или набираете код вручную всякий раз, когда вам его нужно выполнить, SQL должен создавать новый план выполнения запроса. Это замедляет время выполнения вашего кода и потребляет больше ресурсов. Поскольку мы сохраняем и повторно используем существующий план выполнения, хранимая процедура может выполняться значительно быстрее и использовать меньше ресурсов, т.к. нет необходимости создавать план выполнения. Просто загружается план, созданный ранее.
Создание простой хранимой процедуры
Теперь, когда мы знаем немного больше о преимуществах хранимых процедур, давайте создадим базовый тестовый пример для работы. В коде примера, приведенного ниже, мы создаем хранимую процедуру с именем uspGetEmployees. Я уверен, что вы можете догадаться, что подразумевает часть «Get Employees», но что такое «usp» в имени? Вы можете именовать хранимые процедуры как вам нравится, но отраслевым стандартом является использование соглашения, которое мы здесь применили. «usp» — это сокращение от «User Stored Procedure» (пользовательская хранимая процедура).
USE [AdventureWorks2019]
GO
CREATE PROCEDURE uspGetEmployees
AS
SELECT
BusinessEntityID
, FirstName
, LastName
FROM Person.Person;
GO
Видно, что блок кода выше очень похож на создание представления (VIEW) в SQL Server. Вы просто предваряете оператор SELECT текстом «CREATE PROCEDURE «.
Замечание. При создании хранимой процедуры вы можете сократить слово «PROCEDURE» до «PROC»; любой вариант будет работать.
Выполнение хранимых процедур
При выполнении хранимой процедуры вам просто нужно напечатать команду EXECUTE (или EXEC) с последующим именем хранимой процедуры, как в примере ниже.
EXEC uspGetEmployees;
Замечание. В большинстве случаев вам не нужно использовать команду EXEC для выполнения хранимой процедуры. Вы можете напечатать имя хранимой процедуры и выполнить ее. Вы получите одинаковые результаты в любом случае. Для простоты мы будем использовать команду EXEC на всем протяжении статьи.
Изменение/модификация хранимой процедуры
Вы можете использовать команду «ALTER PROC» или «ALTER PROCEDURE» для изменения функциональности хранимой процедуры. Скажем, мы хотим также получать отчество из таблицы «Person.Person» в базе данных AdventureWorks. Вместо создания новой хранимой процедуры мы можем модифицировать имеющуюся, как в примере ниже.
ALTER PROC uspGetEmployees
AS
SELECT
BusinessEntityID
, FirstName
, MiddleName
, LastName
FROM Person.Person;
GO
Давайте выполним хранимую процедуру снова и посмотрим на результаты.
EXEC uspGetEmployees;
Видно, что единственным отличием в результатах этого множества и предыдущего является наличие отчества.
ОК, довольно просто. Давайте продолжим. Теперь мы добавим предложение WHERE и будем использовать предикат IS NOT NULL для фильтрации сотрудников, у которых присутствует отчество (не стоит NULL).
ALTER PROC uspGetEmployees
AS
SELECT
BusinessEntityID
, FirstName
, MiddleName
, LastName
FROM Person.Person
WHERE MiddleName IS NOT NULL;
GO
Давайте опять выполним эту процедуру и посмотрим на результаты.
EXEC uspGetEmployees;
Удаление хранимой процедуры
Удаление хранимой процедуры в SQL подобно удалению таблицы, представления и т.д. Вы просто вызываете команду «DROP PROCEDURE» или «DROP PROC» с именем процедуры.
DROP PROC uspGetEmployees;
Если хранимая процедура не используется, она почти не потребляет ресурсов, и нет особых причин удалять их только потому, что вы хотите освободить ресурсы. Если вы сомневаетесь в необходимости удаления хранимой процедуры, создайте шаблон с содержимым хранимой процедуры, чтобы вам не пришлось переписывать весь этот код позднее.
Входные параметры хранимой процедуры
Что такое входной параметр? В простейшем виде это переменная. Когда мы добавляем переменную к хранимой процедуре, мы считаем ее входным параметром, а не переменной, хотя это одно и то же. Просто считайте это соглашением о наименовании, чтобы отделить одно от другого.
Когда мы добавляем входной параметр в хранимую процедуру, она помещается после команды «CREATE PROC» и выше команды «AS». И, как и для любой переменной, имя параметра должно начинаться с символа @ и последующим типом данных. В следующем примере мы изменяем нашу хранимую процедуру, добавляя переменную и присваивая ей значение по умолчанию.
ALTER PROCEDURE uspGetEmployees
@lastname VARCHAR(40) = 'abel'
AS
SELECT
BusinessEntityID
, FirstName
, LastName
FROM Person.Person
WHERE LastName = @lastname;
GO
Давайте выполним хранимую процедуру и посмотрим на результаты.
EXEC uspGetEmployees;
Что если я захочу вызвать процедуру с другим именем в качестве параметра? Тогда вам просто нужно указать эту переменную после имени хранимой процедуры, как в примере ниже. Тогда будет использоваться указанное значение вместо значения по умолчанию.
EXEC uspGetEmployees 'Akers';
Что если вы не уверены, как пишется имя? Хорошо, тогда опять изменим нашу хранимую процедуру. Теперь мы заменим равенство » sql»>ALTER PROCEDURE uspGetEmployees
@lastname VARCHAR(40) = ‘abel’
AS
SELECT
BusinessEntityID
, FirstName
, LastName
FROM Person.Person
WHERE LastName LIKE @lastname;
GO
Это позволит нам использовать подстановочные знаки в параметре и вернуть, например, каждого, чья фамилия начинается с «Ab».
EXEC uspGetEmployees 'Ab%';
Хранимые процедуры с несколькими входными параметрами
Добавление нескольких параметров следует тем же принципам, что и команда с единственным параметром, только они должны разделяться запятой. В примере ниже мы добавляем параметр «FirstName» и ссылку на него в предложении WHERE. Мы начинаем с удаления значений по умолчанию, которые присваивались параметрам в предыдущих примерах. Значения параметров будут передаваться пользователем при вызове хранимой процедуры.
ALTER PROCEDURE uspGetEmployees
@lastname VARCHAR(40)
, @firstname VARCHAR(40)
AS
SELECT
BusinessEntityID
, FirstName
, LastName
FROM Person.Person
WHERE LastName LIKE @lastname AND FirstName LIKE @firstname;
GO
Теперь при выполнении хранимой процедуры нам нужно включать в вызов значения обоих параметров. В этом примере мы вернем все строки, у которых фамилия начинается с «Ab», а имя — с «K».
EXEC uspGetEmployees 'Ab%', 'K%';
Когда используются несколько параметров, их значения при выполнении хранимой процедуры должны передаваться в том же порядке, в каком он перечислялись при создании хранимой процедуры. Однако это можно обойти. В нашем примере, если я захочу изменить порядок имени и фамилии и указать имя перед фамилией при выполнении процедуры, я могу это сделать путем указания имен переменных, как в примере ниже.
EXEC uspGetEmployees @FirstName = 'Kim', @LastName = 'Ab%';
Обычно вы не будете этого делать. Но если вы не уверены в порядке перечисления параметров, вы можете использовать этот метод, чтобы гарантировать получение желаемых результатов. В противном случае, если вы поменяете порядок параметров при вызове хранимой процедуры без указания имен параметров, запрос не вернет правильный результат. Поскольку сначала будет выполняться поиск по фамилии, а затем по имени — в порядке нашего примера, то запрос ничего не вернет, т.к. нет сотрудника в таблице с фамилией Kim и именем Abercrombie.
Выходные параметры хранимой процедуры
Выходные параметры чуть сложнее. Мы начнем с очень простого примера, чтобы вы могли понять суть создания выходного параметра хранимой процедуры. Блок кода ниже вы можете легко скопировать и вставить в свой редактор запросов. В этом примере я добавил номера строк, чтобы было легче ссылаться при объяснении каждого шага в примере с выходными параметрами.
1) CREATE PROC myRowCount
2) @lname VARCHAR(40),
3) @numrows INT = 0 OUTPUT
4) AS
5) SELECT LastName
6) FROM Person.Person
7) WHERE LastName LIKE @lname
SET @numrows = @@ROWCOUNT;
- Мы создаем новую хранимую процедуру с именем «myRowCount».
- Добавляем входной параметр с именем «@lname» и типом данных «VARCHAR(40)».
- Теперь давайте добавим выходной параметр с именем «@numrows», т.к. мы хотим подсчитать число строк, возвращаемых хранимой процедурой. Тип данных переменной — INT, значение по умолчанию — 0, и нам необходимо указать, что это выходной параметр, с помощью ключевого слова OUTPUT. Это даст знать SQL, что эта переменная будет использоваться для вывода данных.
- Ключевое слово «AS» говорит создать хранимую процедуру, содержащую последующий код.
- Наш основной оператор SELECT.
- Предложение FROM указывает таблицы, откуда будут извлекаться данные.
- Предложение WHERE устанавливает фильтры для оператора SELECT.
- На этой строке мы устанавливаем (присваиваем) для «@numrows» значение «@@ROWCOUNT». Когда вы видите двойной символ @, это признак системной переменной, которых имеется несколько. Познакомиться с системными переменными можно в документации. Поскольку @@ROWCOUNT получает значение при каждом выполнении запроса, мы захватим число, сгенерированное при выполнении нашей хранимой процедуры, и загрузим его в выходной параметр @numrows.
1) DECLARE @retrows INT
2) EXEC myRowCount 'B%', @numrows = @retrows OUTPUT
3) SELECT @retrows AS 'Rows';
- Здесь мы объявляем переменную, чтобы принять значение из выходного параметра процедуры.
В этом примере мы называем новую переменную «@retrows», сокращение от «return rows». Мы должны назначить ей тип данных, который соответствует выходной переменной, которую мы создали в хранимой процедуре. - Здесь мы выполняем нашу хранимую процедуру с помощью команды «EXEC myRowCount», и нам нужно предоставить значение входному параметру. В данном примере мы хотим вернуть все строки, для которых фамилия начинается с «B». Далее на той же строке мы хотим получить значение в нашу переменную «@numrows», которую мы создали в хранимой процедуре, и передать это значение в нашу новую переменную, которую мы описали в операторе DECLARE выше. Опять же нам нужно добавить ключевое слово OUTPUT, чтобы напомнить компилятору об этой переменной.
- Теперь мы создаем последний оператор SELECT, в котором получаем значение (число строк) из переменной «@retrows» и именуем результирующий набор «Rows».
Обработка ошибок в хранимых процедурах
Здесь мы опять изменим хранимую процедуру uspGetEmployees. С помощью функции @@ROWCOUNT, о которой говорилось в предыдущем разделе, мы будем возвращать сообщение «No Records Found», если ничего не будет возвращено. Это упрощенный, но эффективный взгляд на обработку ошибок в хранимых процедурах.
Здесь мы выполним хранимую процедуру дважды. Сначала вернем все строки, фамилии которых начинаются с «Ak»; потом выполним хранимую процедуру, которая вернет сообщение об ошибке. Но первое, что нужно сделать, — это изменить процедуру.
ALTER PROCEDURE uspGetEmployees
@lastname VARCHAR(40)
AS
SELECT
BusinessEntityID
, FirstName
, LastName
FROM Person.Person
WHERE LastName LIKE @lastname
IF @@ROWCOUNT < 1
BEGIN
RAISERROR('No Records Found', 10,1)
END;
GO
Теперь давайте выполним нашу хранимую процедуру для поиска фамилий, которые, как мы знаем, есть в таблице Person.Person.
EXEC uspGetEmployees 'Ak%';
Теперь выполним ту же процедуру с именем, которого нет в таблице Person.Person.
EXEC uspGetEmployees 'zz%';
Несмотря на то, что это был примитивный пример, он даст вам направление работы в тестовом и рабочем окружении. Экспериментируйте и вносите изменения. Делайте обработку ошибок интуитивно понятной.
Безопасность хранимых процедур
- Абстракция: Пользователи могут выполнять сложные запросы, не зная структуры лежащих в основе таблиц или других объектов базы данных.
- Шифрование: Мы можете зашифровать код в хранимой процедуре после ее создания.
- Предотвращение SQL-инъекции: Все передаваемые в хранимую процедуру параметры могут быть проверены до передачи их в таблицу или другой объект базы данных.
- Согласованное манипулирование данными: Хранимая процедура выполняет всякий раз один и тот же код в одном и том же порядке.
- Контроль выполнения: Вы можете установить разрешения на хранимую процедуру, позволяя только определенным пользователям ли группам выполнять ее.
- Обработка ошибок: Хранимые процедуры обеспечивают возможность использовать последовательную и эффективную обработку ошибок и создание отчетов.
Ссылки по теме:
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Как выбрать подходящие данные для параметров процедуры: советы и рекомендации
Узнайте, как определить, какие данные следует включить в список параметров процедуры при написании программного кода. Читайте статью и узнайте, как правильно выбрать параметры для оптимальной работы программы.
Безусловно, выбор правильных данных для списка параметров процедуры является одним из самых важных этапов разработки программного обеспечения. Неправильный выбор параметров может привести к множеству проблем и ошибок в работе программы, что может негативно сказаться на ее функциональности и эффективности.
Существует множество методов и подходов к выбору параметров процедуры, но не все они одинаково эффективны и пригодны для конкретных задач. В данной статье мы рассмотрим некоторые советы и рекомендации, которые помогут вам выбрать правильные данные для списка параметров процедуры и обеспечить более качественную работу программы.
Мы рассмотрим такие вопросы как выбор типов данных для параметров, определение их количества и порядка, учет особенностей работы программы и многие другие аспекты, которые вам помогут сделать правильный выбор параметров и обеспечить более эффективную работу программы.
Как выбрать данные для списка параметров процедуры: советы и рекомендации
Список параметров является одним из наиболее важных элементов в описании процедуры. Он определяет, какие данные будут использоваться процедурой и что нужно передавать ей при вызове.
Правильный выбор данных для списка параметров может определять успешность работы процедуры и ее эффективность.
Перед тем, как выбрать данные для списка параметров, необходимо определить цели и задачи процедуры. Ясное понимание того, как процедура должна функционировать, поможет определить, какие данные необходимы для передачи в нее.
Еще одним важным фактором является тип данных. Некоторые процедуры работают только с определенными типами данных, поэтому необходимо проверить, что выбранные данные соответствуют нужному типу.
Также стоит учитывать потенциальные ошибки, которые могут возникнуть при передаче данных в процедуру. Например, если процедура ожидает только целочисленные значения, то передача строковых или дробных значений может вызвать ошибку.
И наконец, не забывайте о контексте процедуры и ее взаимодействии с другими элементами программы. Например, если процедура вызывается из другой функции, то ее параметры могут зависеть от возвращаемого значения этой функции.
- Определите цели и задачи процедуры.
- Убедитесь, что выбранные данные соответствуют нужному типу.
- Проверьте, что передаваемые данные не вызовут ошибок.
- Учитывайте контекст процедуры и ее взаимодействие с другими элементами программы.
Правильный выбор данных для списка параметров может сохранить время и улучшить эффективность программы. Следуя нескольким простым советам и рекомендациям, вы сможете выбрать подходящие данные для списка параметров процедуры и обеспечить ее успешную работу.
Понимание процедуры и ее цели
Прежде чем начинать выбор правильных данных для списка параметров процедуры, необходимо понимать ее цель и задачи, которые должны быть выполнены. Это поможет исключить ошибки при выборе данных и сделать процедуру более эффективной.
Если процедура предназначена для добавления новой информации в базу данных, необходимо выбрать данные, которые соответствуют полям в этой базе данных. Если процедура нужна для обновления данных, то необходимо выбрать те данные, которые должны быть изменены.
Очень важно понимать, что процедура должна быть выполнена с определенной последовательностью шагов. Поэтому перед началом выбора данных для списка параметров, необходимо проанализировать список требуемых шагов и убедиться, что все данные соответствуют этим шагам.
Более того, правильный выбор данных для списка параметров должен обеспечить выполнение процедуры без ошибок. Для этого можно использовать список рекомендаций, который указывает на типы данных и формат данных для каждого параметра, необходимого для выполнения процедуры.
И тут не стоит забывать о том, что процедуру выполнит человек, а не машина. Поэтому задача выбора правильных данных для списка параметров требует не только знаний в области программирования, но и логического мышления, чтобы избежать ошибок и сделать процедуру оптимальной.
Читать далее: Как легко и эффективно научить ребенка пользоваться компьютером: полезные советы и рекомендации
Анализ типа данных
Один из важных аспектов выбора правильных данных для списка параметров процедуры — это анализ типа данных. Тип данных влияет на то, как программа будет обрабатывать и использовать информацию.
Например, если процедура принимает данные, которые должны быть числами, то необходимо убедиться в правильности формата данных. Если данные являются строками, необходимо провести проверку на длину строки и форматирование.
Более того, можно проводить дополнительный анализ данных на соответствие определенным критериям. Например, если процедура принимает данные, которые должны быть в определенном формате (например, дата, время или номер телефона), необходимо проверить входные данные на соответствие стандарту.
При выборе правильных данных для списка параметров процедуры необходимо убедиться, что тип данных соответствует не только формату, но и основному предназначению. Например, булев тип данных используется для логических значений, класы-обертки используются для работы со структурами данных, а строковые типы данных используются для создания текстовых сообщений.
Определение минимально необходимых параметров
Перед началом работы над процедурой необходимо определить минимальный набор параметров, необходимых для ее работы. Это позволяет упростить процесс работы с процедурой и сократить время, которое будет потрачено на ее использование.
Первым шагом в определении минимально необходимых параметров является изучение требований и целей процедуры. Необходимо определить, какие данные нужны для достижения заданных целей, и найти оптимальный набор параметров, которые позволят получить необходимый результат.
При выборе параметров следует учитывать, какие данные могут быть получены автоматически, например, из других источников, и какие нужно вводить вручную. Также следует обратить внимание на то, какие данные могут быть получены из других параметров процедуры, и исключить их из списка необходимых параметров.
- В процессе определения минимально необходимых параметров не стоит забывать о том, что недостаточное количество параметров может привести к некорректной работе процедуры, а чрезмерное количество параметров может затруднить работу с ней.
- При определении параметров также следует учитывать возможность дальнейшего расширения процедуры и добавления новых параметров с минимальным изменением ее кода.
В результате правильного определения минимально необходимых параметров можно ускорить процесс работы с процедурой, сделать его более удобным и эффективным, а также повысить ее стабильность и устойчивость к ошибкам.
Определение дополнительных параметров
При выборе данных для списка параметров процедуры, необходимо учитывать не только основные параметры, но и дополнительные. Определение дополнительных параметров является важным этапом, который позволяет уточнить задачи, цели и требования к процедуре.
Дополнительные параметры могут включать в себя такие данные, как типы файлов, допустимые форматы входных данных, параметры и настройки, которые необходимы для выполнения процедуры. Также нужно учитывать возможность добавления новых параметров в будущем.
Для определения дополнительных параметров необходимо провести анализ требований к процедуре, учесть все возможные используемые в процессе данные и параметры. Важно не упускать деталей, поскольку пропущенный параметр может привести к ошибке и некорректной работе процедуры.
Процесс определения дополнительных параметров необходимо проводить в тесном контакте с командой разработки и пользователями. Таким образом, можно учесть все особенности и недостатки процедуры и сделать ее более удобной и функциональной.
Также не забывайте о документации. Она должна содержать описание всех параметров процедуры, их типы, форматы, возможные значения и примеры использования. Это позволит пользователям легко и быстро понимать, как использовать процедуру и правильно определять параметры.
- Совет: При определении дополнительных параметров используйте названия, которые понятны и легки для запоминания. Также желательно использовать общепринятые сокращения и стандартные обозначения.
- Совет: Используйте параметры по умолчанию, если это возможно. Это снизит вероятность ошибок и упростит процедуру.
- Совет: Не забывайте про конфиденциальность и безопасность при определении параметров процедуры. Используйте специальные параметры для шифрования, проверки подлинности и других мер защиты данных.
Сбор данных для каждого параметра
Для правильной работы процедуры необходимы точные и актуальные данные для каждого параметра. При сборе данных следует учитывать следующие рекомендации:
1. Определить требования к каждому параметру
Перед сбором данных необходимо определить требования к каждому параметру. Например, если параметр является числом, то необходимо уточнить, каким должен быть его диапазон значений, какие единицы измерения используются и т.д.
2. Использовать надежные источники данных
Для сбора данных следует использовать надежные источники, например, официальные документы, базы данных или опросы. Не стоит полагаться на устаревшую информацию или данные, полученные из ненадежных источников.
3. Проверять достоверность данных
Перед использованием данных в процедуре следует проверить их достоверность. Например, можно сравнить данные из разных источников или провести дополнительные расчёты для подтверждения правильности информации.
4. Учитывать возможные ошибки в данных
При сборе данных следует учитывать возможные ошибки или неточности. Например, при сборе данных о зарплате следует учитывать возможность ошибки в заполнении данных или сокрытия информации.
Читать далее: Варианты выборки в математике: виды, примеры, правила составления
5. Приводить данные к одному формату
Для удобства работы процедуры следует приводить данные к одному формату. Например, если параметр является датой, то следует использовать одинаковый формат для всех дат в процедуре.
Соблюдение этих рекомендаций позволит получить надежные и актуальные данные для каждого параметра и обеспечить правильную работу процедуры.
Оценка качества данных
Оценка качества данных является важной частью процесса выбора правильных данных для списка параметров процедуры. Вам нужно убедиться, что данные, которые вы собираетесь использовать, точны, полны, актуальны и соответствуют требованиям вашего проекта.
Для оценки качества данных, предпочтительно использовать несколько источников данных. Это поможет вам отслеживать любые расхождения и убедиться в том, что данные верны.
Если вы используете внешние данные, такие как открытые данные или данные от других организаций, необходимо проверить, как эти данные были собраны, обработаны и хранились. Вы должны убедиться, что данные были собраны надлежащим образом и не содержат ошибок.
Кроме того, убедитесь, что данные соответствуют вашим требованиям. Например, если вам нужны данные за последние 6 месяцев, убедитесь, что данные соответствуют этому требованию.
Наконец, не забывайте о целостности данных. Убедитесь, что все данные хранятся в одной таблице или файле и что они связаны друг с другом. Это поможет вам избежать ошибок и обеспечить точность и полноту данных.
- Проверьте точность данных
- Убедитесь в полноте данных
- Проверьте актуальность данных
- Убедитесь, что данные соответствуют требованиям проекта
- Обеспечьте целостность данных
Частые ошибки при выборе данных
1. Неправильная интерпретация данных
Одной из самых распространенных ошибок является неправильная интерпретация данных, которые будут использоваться для параметров процедуры. Например, если задачей является поиск пользователей младше 30 лет, то необходимо убедиться, что дата рождения указана в правильном формате и не содержит ошибок. Иначе результаты процедуры будут некорректными.
2. Некорректное использование типов данных
При выборе данных для параметров процедуры, необходимо убедиться, что выбраны правильные типы данных. Например, если в параметры передаются числовые значения, то необходимо использовать числовые типы данных в языке программирования, а не строки. Неправильное использование типов данных может привести к сбоям и некорректным результатам работы процедуры.
3. Недостаточно информации для выбора данных
Некоторые параметры процедуры могут требовать большего объема данных, чем доступно в текущий момент. Например, если требуется указать координаты географической точки, то необходимо знать графическое представление карты, на которой эти координаты будут отображаться. В этом случае, без необходимой информации выбор данных для параметров процедуры становится невозможным.
4. Несоответствие формата данных
В случае, когда данные для параметров процедуры должны быть в определенном формате, необходимо убедиться, что все данные соответствуют этому формату. Например, если требуется указать дату в определенном формате, то необходимо убедиться, что все данные соответствуют этому формату. Несоответствие формата данных может привести к ошибке программы или некорректным результатам.
Рекомендации для улучшения качества данных
1. Проверьте и очистите данные перед использованием. Перед тем как использовать данные, необходимо провести их анализ и проверить, насколько они точны и полные. Удалите дубликаты и исправьте ошибки, чтобы убедиться в правильности информации.
2. Используйте правильные единицы измерения. Важно использовать правильные единицы измерения для каждого параметра. Так, если вы работаете с данными о массе, необходимо указать единицу измерения — граммы или килограммы и т.д.
3. Стандартизируйте данные. Чтобы улучшить качество данных, стандартизируйте их. Если значения параметров записаны по-разному, переведите их в единый формат. Например, все даты можно записать в формате DD.MM.YYYY.
4. Используйте справочники. Использование справочников упрощает работу с данными, улучшает их качество и сокращает время на их обработку. Справочники могут содержать информацию об единицах измерения, кодах товаров или услуг и т.д.
5. Не храните конфиденциальную информацию в списках параметров процедур. Конфиденциальная информация должна храниться в защищенном месте. В списках параметров процедур необходимо указывать только те данные, которые не являются конфиденциальными.
6. Создавайте документацию для данных. Создание документации для данных поможет вам быстро и удобно находить необходимую информацию. В документации можно указать описание параметров, типы данных и примеры реальных значений.
7. Определите критерии качества данных. Определите критерии, по которым будете оценивать качество данных. Критерии могут включать точность, полноту, актуальность и т.д. Установите требуемый уровень качества для каждого параметра и постоянно контролируйте его.
Сбор данных от нескольких источников
При выборе параметров для процедуры важно учитывать данные, полученные из различных источников.
Например, если вы проектируете приложение для учета продуктового склада, то вам может понадобится информация о том, какие товары запрашивают чаще всего покупатели, какие товары имеют наибольшую прибыльность для магазина и какие товары быстрее всего просрочены.
Читать далее: Automation test android: что это и как работать с ним?
Хотя каждая из этих информационных составляющих может быть получена из разных источников (например, статистика продаж, аналитика продуктового склада и журнал учета сроков годности), все они должны быть учтены при выборе параметров для процедуры.
- Важно анализировать данные из разных источников и выбирать параметры, учитывающие каждый из них.
- Необходимо четко определить степень значимости каждой из информационных составляющих и учитывать ее при выборе параметров.
- Данные могут быть получены и автоматически, и вручную. Главное, чтобы они были достоверными и пригодными для использования в процедуре.
Проверка правильности списка параметров
При выборе правильных данных для списка параметров процедуры, необходимо убедиться, что список содержит все необходимые параметры, но не слишком большое количество. Кроме того, необходимо проверить правильность и соответствие данных в списке.
Первый шаг в проверке правильности списка параметров — это убедиться, что список содержит все необходимые параметры. Для этого необходимо тщательно изучить документацию и понять, какие параметры могут быть использованы в процедуре.
Далее следует проверить правильность данных в списке. Проверить правильность можно, используя тесты. Например, если процедура принимает на входе число, необходимо проверить, что список содержит только числа.
Ещё один способ проверить правильность списка параметров — это обратиться к разработчику программы или к команде технической поддержки. Они смогут сказать, какие параметры правильно использовать и какие данные нужно передавать в список.
- Убедиться, что список содержит все необходимые параметры
- Проверить правильность данных в списке, используя тесты
- Обратиться к разработчику программы или к команде технической поддержки для проверки правильности параметров
Пример правильно составленного списка параметров
Ниже представлен пример правильно составленного списка параметров для процедуры создания новой заявки в банковской системе:
- Имя клиента: строка, обязательный параметр;
- Номер счета: число, обязательный параметр;
- Сумма заявки: число с плавающей запятой, обязательный параметр;
- Дата заявки: дата в формате ГГГГ-ММ-ДД, необязательный параметр, по умолчанию устанавливается текущая дата;
- Описание заявки: строка, необязательный параметр, по умолчанию устанавливается пустое значение.
В данном примере используются понятные и лаконичные названия параметров, которые четко передают свою суть. Также параметры правильно разбиты на обязательные и необязательные, что позволяет избежать ошибок при вызове процедуры и упрощает ее использование.
Вопрос-ответ:
Как выбрать правильные данные для списка параметров процедуры?
Выбор правильных данных зависит от цели процедуры и ее специфики. Необходимо определить, какие параметры будут использоваться в процессе работы. Эти параметры могут включать в себя числовые значения, текстовые данные, булевы переменные и т. д. Кроме того, необходимо учитывать параметры, связанные с безопасностью и контролем доступа.
Какие факторы могут влиять на выбор параметров процедуры?
Факторы, влияющие на выбор параметров процедуры, могут включать в себя цели процедуры, специфика процесса, используемые технологии, требования к безопасности и т. д. Также необходимо учитывать контекст выполнения процедуры, например, расположение пользователя, используемый язык и т. д.
Как можно определить, какие параметры необходимо использовать в процедуре?
Для определения параметров, необходимых в процедуре, необходимо проанализировать цели и сценарий выполнения процедуры. Также необходимо учитывать ограничения и возможности используемых технологий, параметры безопасности и другие факторы, которые могут влиять на выбор конкретных параметров.
Какие составляющие должны быть включены в список параметров процедуры?
Список параметров процедуры должен включать все необходимые значения, параметры и объекты, которые будут использоваться в процессе работы. Эти параметры могут включать в себя текстовые данные, числовые значения, булевы переменные, объекты и т. д. Важно убедиться, что все необходимые параметры будут переданы в процедуру.
Какие ограничения могут оказывать влияние на выбор параметров процедуры?
Ограничения, связанные с безопасностью, доступом к данным и использованием технологий, могут оказывать влияние на выбор параметров процедуры. Также важно учитывать ограничения, связанные с объемом передаваемой информации, доступностью параметров и другие факторы, которые могут влиять на выбор параметров процедуры.
Какие механизмы можно использовать для передачи параметров в процедуру?
Для передачи параметров в процедуру можно использовать различные механизмы, включая передачу значений через аргументы функции, использование глобальных переменных, передачу параметров через файлы, базы данных и другие механизмы. Важно учитывать ограничения и возможности каждого механизма при выборе способа передачи параметров в процедуру.
Как выбрать правильный формат передачи данных для параметров процедуры?
Выбор правильного формата передачи данных зависит от требований процедуры и используемых технологий. Некоторые форматы, такие как JSON и XML, могут обеспечивать более гибкий и расширяемый способ передачи данных, тогда как другие форматы, такие как CSV и TSV, могут быть более подходящими для передачи большого объема данных. Важно выбрать формат, который наиболее соответствует требованиям процедуры и используемых технологий.
Хранимые процедуры
— это специальный тип пакета инструкций Transact-SQL, созданный, используя язык SQL и процедурные расширения. Основное различие между пакетом и хранимой процедурой состоит в том, что последняя сохраняется в виде объекта базы данных. Иными словами, хранимые процедуры сохраняются на стороне сервера, чтобы улучшить производительность и постоянство выполнения повторяемых задач.
Компонент Database Engine поддерживает хранимые процедуры и системные процедуры. Хранимые процедуры создаются таким же образом, как и все другие объекты баз данных, т.е. при помощи языка DDL. Системные процедуры предоставляются компонентом Database Engine и могут применяться для доступа к информации в системном каталоге и ее модификации.
При создании хранимой процедуры можно определить необязательный список параметров. Таким образом, процедура будет принимать соответствующие аргументы при каждом ее вызове. Хранимые процедуры могут возвращать значение, содержащее определенную пользователем информацию или, в случае ошибки, соответствующее сообщение об ошибке.
Хранимая процедура предварительно компилируется перед тем, как она сохраняется в виде объекта в базе данных. Предварительно компилированная форма процедуры сохраняется в базе данных и используется при каждом ее вызове. Это свойство хранимых процедур предоставляет важную выгоду, заключающуюся в устранении (почти во всех случаях) повторных компиляций процедуры и получении соответствующего улучшения производительности. Это свойство хранимых процедур также оказывает положительный эффект на объем данных, участвующих в обмене между системой баз данных и приложениями. В частности, для вызова хранимой процедуры объемом в несколько тысяч байтов может потребоваться меньше, чем 50 байт. Когда множественные пользователи выполняют повторяющиеся задачи с применением хранимых процедур, накопительный эффект такой экономии может быть довольно значительным.
Хранимые процедуры можно также использовать для следующих целей:
- управления авторизацией доступа;
- для создания журнала логов о действиях с таблицами баз данных.
Использование хранимых процедур предоставляет возможность управления безопасностью на уровне, значительно превышающем уровень безопасности, предоставляемый использованием инструкций GRANT и REVOKE, с помощью которых пользователям предоставляются разные привилегии доступа. Это возможно вследствие того, что авторизация на выполнение хранимой процедуры не зависит от авторизации на модифицирование объектов, содержащихся в данной хранимой процедуре, как это описано в следующем разделе.
Хранимые процедуры, которые создают логи операций записи и/или чтения таблиц, предоставляют дополнительную возможность обеспечения безопасности базы данных. Используя такие процедуры, администратор базы данных может отслеживать модификации, вносимые в базу данных пользователями или прикладными программами.
Создание и исполнение хранимых процедур
Хранимые процедуры создаются посредством инструкции CREATE PROCEDURE, которая имеет следующий синтаксис:
Параметр schema_name определяет имя схемы, которая назначается владельцем созданной хранимой процедуры. Параметр proc_name определяет имя хранимой процедуры. Параметр @param1 является параметром процедуры (формальным аргументом), чей тип данных определяется параметром type1. Параметры процедуры являются локальными в пределах процедуры, подобно тому, как локальные переменные являются локальными в пределах пакета. Параметры процедуры — это значения, которые передаются вызывающим объектом процедуре для использования в ней. Параметр default1 определяет значение по умолчанию для соответствующего параметра процедуры. (Значением по умолчанию также может быть NULL.)
Опция OUTPUT указывает, что параметр процедуры является возвращаемым, и с его помощью можно возвратить значение из хранимой процедуры вызывающей процедуре или системе.
Как уже упоминалось ранее, предварительно компилированная форма процедуры сохраняется в базе данных и используется при каждом ее вызове. Если же по каким-либо причинам хранимую процедуру требуется компилировать при каждом ее вызове, при объявлении процедуры используется опция WITH RECOMPILE. Использование опции WITH RECOMPILE сводит на нет одно из наиболее важных преимуществ хранимых процедур: улучшение производительности благодаря одной компиляции. Поэтому опцию WITH RECOMPILE следует использовать только при частых изменениях используемых хранимой процедурой объектов базы данных.
Предложение EXECUTE AS определяет контекст безопасности, в котором должна исполняться хранимая процедура после ее вызова. Задавая этот контекст, с помощью Database Engine можно управлять выбором учетных записей пользователей для проверки полномочий доступа к объектам, на которые ссылается данная хранимая процедура.
По умолчанию использовать инструкцию CREATE PROCEDURE могут только члены предопределенной роли сервера sysadmin и предопределенной роли базы данных db_owner или db_ddladmin. Но члены этих ролей могут присваивать это право другим пользователям с помощью инструкции GRANT CREATE PROCEDURE.
В примере ниже показано создание простой хранимой процедуры для работы с таблицей Project:
USE SampleDb; GO CREATE PROCEDURE IncreaseBudget (@percent INT=5) AS UPDATE Project SET Budget = Budget + Budget * @percent/100;
Как говорилось ранее, для разделения двух пакетов используется инструкция GO. Инструкцию CREATE PROCEDURE нельзя объединять с другими инструкциями Transact-SQL в одном пакете. Хранимая процедура IncreaseBudget увеличивает бюджеты для всех проектов на определенное число процентов, определяемое посредством параметра @percent. В процедуре также определяется значение числа процентов по умолчанию (5), которое применяется, если во время выполнения процедуры этот аргумент отсутствует.
Хранимые процедуры могут обращаться к несуществующим таблицам. Это свойство позволяет выполнять отладку кода процедуры, не создавая сначала соответствующие таблицы и даже не подключаясь к конечному серверу.
В отличие от основных хранимых процедур, которые всегда сохраняются в текущей базе данных, возможно создание временных хранимых процедур, которые всегда помещаются во временную системную базу данных tempdb. Одним из поводов для создания временных хранимых процедур может быть желание избежать повторяющегося исполнения определенной группы инструкций при соединении с базой данных. Можно создавать локальные или глобальные временные процедуры. Для этого имя локальной процедуры задается с одинарным символом # (#proc_name), а имя глобальной процедуры — с двойным (##proc_name).
Локальную временную хранимую процедуру может выполнить только создавший ее пользователь и только в течение соединения с базой данных, в которой она была создана. Глобальную временную процедуру могут выполнять все пользователи, но только до тех пор, пока не завершится последнее соединение, в котором она выполняется (обычно это соединение создателя процедуры).
Жизненный цикл хранимой процедуры состоит из двух этапов: ее создания и ее выполнения. Каждая процедура создается один раз, а выполняется многократно. Хранимая процедура выполняется посредством инструкции EXECUTE пользователем, который является владельцем процедуры или обладает правом EXECUTE для доступа к этой процедуре. Инструкция EXECUTE имеет следующий синтаксис:
За исключением параметра return_status, все параметры инструкции EXECUTE имеют такое же логическое значение, как и одноименные параметры инструкции CREATE PROCEDURE. Параметр return_status определяет целочисленную переменную, в которой сохраняется состояние возврата процедуры. Значение параметру можно присвоить, используя или константу (value), или локальную переменную (@variable). Порядок значений именованных параметров не важен, но значения неименованных параметров должны предоставляться в том порядке, в каком они определены в инструкции CREATE PROCEDURE.
Предложение DEFAULT предоставляет значения по умолчанию для параметра процедуры, которое было указано в определении процедуры. Когда процедура ожидает значение для параметра, для которого не было определено значение по умолчанию и отсутствует параметр, либо указано ключевое слово DEFAULT, то происходит ошибка.
Когда инструкция EXECUTE является первой инструкцией пакета, ключевое слово EXECUTE можно опустить. Тем не менее будет надежнее включать это слово в каждый пакет. Использование инструкции EXECUTE показано в примере ниже:
USE SampleDb; EXECUTE IncreaseBudget 10;
Инструкция EXECUTE в этом примере выполняет хранимую процедуру IncreaseBudget, которая увеличивает бюджет всех проектов на 10%.
В примере ниже показано создание хранимой процедуры для обработки данных в таблицах Employee и Works_on:
USE SampleDb; GO CREATE PROCEDURE ModifyEmpId (@oldId INTEGER, @newId INTEGER) AS UPDATE Employee SET WHERE UPDATE Works_on SET EmpId = @newId WHERE EmpId = @oldId;
Процедура ModifyEmpId в примере иллюстрирует использование хранимых процедур, как часть процесса обеспечения ссылочной целостности (в данном случае между таблицами Employee и Works_on). Подобную хранимую процедуру можно использовать внутри определения триггера, который собственно и обеспечивает ссылочную целостность.
В примере ниже показано использование в хранимой процедуре предложения OUTPUT:
USE SampleDb; GO CREATE PROCEDURE DeleteEmployee @empId INT, @counter INT OUTPUT AS SELECT @counter = COUNT(*) FROM Works_on WHERE EmpId = @empId DELETE FROM Employee WHERE DELETE FROM Works_on WHERE EmpId = @empId;
Данную хранимую процедуру можно запустить на выполнение посредством следующих инструкций:
DECLARE @quantityDeleteEmployee INT; EXECUTE DeleteEmployee @empId=18316, @counter=@quantityDeleteEmployee OUTPUT; PRINT N'Удалено сотрудников: ' + convert(nvarchar(30), @quantityDeleteEmployee);
Эта процедура подсчитывает количество проектов, над которыми занят сотрудник с табельным номером @empId, и присваивает полученное значение параметру ©counter. После удаления всех строк для данного табельного номера из таблиц Employee и Works_on вычисленное значение присваивается переменной @quantityDeleteEmployee.
Значение параметра возвращается вызывающей процедуре только в том случае, если указана опция OUTPUT. В примере выше процедура DeleteEmployee передает вызывающей процедуре параметр @counter, следовательно, хранимая процедура возвращает значение системе. Поэтому параметр @counter необходимо указывать как в опции OUTPUT при объявлении процедуры, так и в инструкции EXECUTE при ее вызове.
Предложение WITH RESULTS SETS инструкции EXECUTE
В SQL Server 2012 для инструкции EXECUTE вводится предложение WITH RESULTS SETS, посредством которого при выполнении определенных условий можно изменять форму результирующего набора хранимой процедуры.
Следующие два примера помогут объяснить это предложение. Первый пример является вводным примером, который показывает, как может выглядеть результат, когда опущено предложение WITH RESULTS SETS:
USE SampleDb; GO CREATE PROCEDURE EmployeesInDept (@dept CHAR(4)) AS SELECT Id, LastName FROM Employee WHERE DepartamentNumber IN ( SELECT @dept FROM Department GROUP BY Number);
Процедура EmployeesInDept — это простая процедура, которая отображает табельные номера и фамилии всех сотрудников, работающих в определенном отделе. Номер отдела является параметром процедуры, и его нужно указать при ее вызове. Выполнение этой процедуры выводит таблицу с двумя столбцами, заголовки которых совпадают с наименованиями соответствующих столбцов таблицы базы данных, т.е. Id и LastName. Чтобы изменить заголовки столбцов результата (а также их тип данных), в SQL Server 2012 применяется новое предложение WITH RESULTS SETS. Применение этого предложения показано в примере ниже:
USE SampleDb; EXEC EmployeesInDept 'd1' WITH RESULT SETS (([Id] INT NOT NULL, [Фамилия] CHAR(20) NOT NULL));
Результат выполнения хранимой процедуры, вызванной таким способом, будет следующим:
Как можно видеть, запуск хранимой процедуры с использованием предложения WITH RESULT SETS в инструкции EXECUTE позволяет изменить наименования и тип данных столбцов результирующего набора, выдаваемого данной процедурой. Таким образом, эта новая функциональность предоставляет большую гибкость в исполнении хранимых процедур и помещении их результатов в новую таблицу.
Изменение структуры хранимых процедур
Компонент Database Engine также поддерживает инструкцию ALTER PROCEDURE для модификации структуры хранимых процедур. Инструкция ALTER PROCEDURE обычно применяется для изменения инструкций Transact-SQL внутри процедуры. Все параметры инструкции ALTER PROCEDURE имеют такое же значение, как и одноименные параметры инструкции CREATE PROCEDURE. Основной целью использования этой инструкции является избежание переопределения существующих прав хранимой процедуры.
Компонент Database Engine поддерживает тип данных CURSOR. Этот тип данных используется для объявления курсоров в хранимых процедурах. — это конструкция программирования, применяемая для хранения результатов запроса (обычно набора строк) и для предоставления пользователям возможности отображать этот результат построчно.
Для удаления одной или группы хранимых процедур используется инструкция DROP PROCEDURE. Удалить хранимую процедуру может только ее владелец или члены предопределенных ролей db_owner и sysadmin.
Хранимые процедуры и среда CLR
SQL Server поддерживает общеязыковую среду выполнения CLR (Common Language Runtime), которая позволяет разрабатывать различные объекты баз данных (хранимые процедуры, определяемые пользователем функции, триггеры, определяемые пользователем статистические функции и пользовательские типы данных), применяя языки C# и Visual Basic. Среда CLR также позволяет выполнять эти объекты, используя систему общей среды выполнения.
Среда CLR разрешается и запрещается посредством опции clr_enabled системной процедуры sp_configure, которая запускается на выполнение инструкцией RECONFIGURE. В примере ниже показано, как можно с помощью системной процедуры sp_configure разрешить использование среды CLR:
USE SampleDb; EXEC sp_configure 'clr_enabled',1 RECONFIGURE
Для создания, компилирования и сохранения процедуры с помощью среды CLR требуется выполнить следующую последовательность шагов в указанном порядке:
- Создать хранимую процедуру на языке C# или Visual Basic, а затем скомпилировать ее, используя соответствующий компилятор.
- Используя инструкцию CREATE ASSEMBLY, создать соответствующий выполняемый файл.
- Сохранить процедуру в виде объекта сервера, используя инструкцию CREATE PROCEDURE.
- Выполнить процедуру, используя инструкцию EXECUTE.
На рисунке ниже показана графическая схема ранее изложенных шагов. Далее приводится более подробное описание этого процесса.
Сначала создайте требуемую программу в какой-либо среде разработки, например Visual Studio. Скомпилируйте готовую программу в объектный код, используя компилятор C# или Visual Basic. Этот код сохраняется в файле динамической библиотеки (.dll), который служит источником для инструкции CREATE ASSEMBLY, создающей промежуточный выполняемый код. Далее выполните инструкцию CREATE PROCEDURE, чтобы сохранить выполняемый код в виде объекта базы данных. Наконец, запустите процедуру на выполнение, используя уже знакомую нам инструкцию EXECUTE.
В примере ниже показан исходный код хранимой процедуры на языке C#:
using System.Data.SqlClient; using Microsoft.SqlServer.Server; public partial class StoredProcedures < [SqlProcedure] public static int CountEmployees() < int rows; SqlConnection connection = new SqlConnection("Context Connection=true"); connection.Open(); SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = "select count(*) as 'Количество сотрудников' " + "from Employee"; rows = (int)cmd.ExecuteScalar(); connection.Close(); return rows; >>
В этой процедуре реализуется запрос для подсчета числа строк в таблице Employee. В директивах using в начале программы указываются пространства имен, требуемые для ее выполнения. Применение этих директив позволяет указывать в исходном коде имена классов без явного указания соответствующих пространств имен. Далее определяется класс StoredProcedures, для которого применяется атрибут SqlProcedure, который информирует компилятор о том, что этот класс является хранимой процедурой. Внутри кода класса определяется метод CountEmployees(). Соединение с системой баз данных устанавливается посредством экземпляра класса SqlConnection. Чтобы открыть соединение, применяется метод Open() этого экземпляра. А метод CreateCommand() позволяет обращаться к экземпляру класса SqlCommnd, которому передается нужная SQL-команда.
В следующем фрагменте кода:
cmd.CommandText = "select count(*) as 'Количество сотрудников' " + "from Employee";
используется инструкция SELECT для подсчета количества строк в таблице Employee и отображения результата. Текст команды указывается, присваивая свойству CommandText переменной cmd экземпляр, возвращаемый методом CreateCommand(). Далее вызывается метод ExecuteScalar() экземпляра SqlCommand. Этот метод возвращает скалярное значение, которое преобразовывается в целочисленный тип данных int и присваивается переменной rows.
Теперь вы можете скомпилировать этот код, используя среду Visual Studio. Я добавил этот класс в проект с именем CLRStoredProcedures, поэтому Visual Studio скомпилирует одноименную сборку с расширением *.dll. В примере ниже показан следующий шаг в создании хранимой процедуры: создание выполняемого кода. Прежде чем выполнять код в этом примере, необходимо узнать расположение скомпилированного dll-файла (обычно находится в папке Debug проекта).
USE SampleDb; GO CREATE ASSEMBLY CLRStoredProcedures FROM 'D:\Projects\CLRStoredProcedures\bin\Debug\CLRStoredProcedures.dll' WITH PERMISSION_SET = SAFE
Инструкция CREATE ASSEMBLY принимает в качестве ввода управляемый код и создает соответствующий объект, для которого можно создавать хранимые процедуры среды CLR, определяемые пользователем функции и триггеры. Эта инструкция имеет следующий синтаксис:
В параметре assembly_name указывается имя сборки. В необязательном предложении AUTHORIZATION указывается имя роли в качестве владельца этой сборки. В предложении FROM указывается путь, где находится загружаемая сборка.
Предложение WITH PERMISSION_SET является очень важным предложением инструкции CREATE ASSEMBLY и всегда должно указываться. В нем определяется набор прав доступа, предоставляемых коду сборки. Набор прав SAFE является наиболее ограничивающим. Код сборки, имеющий эти права, не может обращаться к внешним системным ресурсам, таким как файлы. Набор прав EXTERNAL_ACCESS позволяет коду сборки обращаться к определенным внешним системным ресурсам, а набор прав UNSAFE предоставляет неограниченный доступ к ресурсам, как внутри, так и вне системы базы данных.
Чтобы сохранить информацию о коде сборке, пользователь должен иметь возможность выполнить инструкцию CREATE ASSEMBLY. Владельцем сборки является пользователь (или роль), исполняющий эту инструкцию. Владельцем сборки можно сделать другого пользователя, используя предложение AUTHORIZATION инструкции CREATE SCHEMA.
Компонент Database Engine также поддерживает инструкции ALTER ASSEMBLY и DROP ASSEMBLY. Инструкция ALTER ASSEMBLY используется для обновления сборки до последней версии. Эта инструкция также добавляет или удаляет файлы, связанные с соответствующей сборкой. Инструкция DROP ASSEMBLY удаляет указанную сборку и все связанные с ней файлы из текущей базы данных.
В примере ниже показано создание хранимой процедуры на основе управляемого кода, реализованного ранее:
USE SampleDb; GO CREATE PROCEDURE CountEmployees AS EXTERNAL NAME CLRStoredProcedures.StoredProcedures.CountEmployees
Инструкция CREATE PROCEDURE в примере отличается от такой же инструкции в примерах ранее тем, что она содержит параметр EXTERNAL NAME. Этот параметр указывает, что код создается средой CLR. Имя в этом предложении состоит из трех частей:
assembly_name.class_name.method_name
- assembly_name — указывает имя сборки;
- class_name — указывает имя общего класса;
- method_name — необязательная часть, указывает имя метода, который задается внутри класса.
Выполнение процедуры CountEmployees показано в примере ниже:
USE SampleDb; DECLARE @count INT EXECUTE @count = CountEmployees PRINT @count -- Вернет 7
Инструкция PRINT возвращает текущее количество строк в таблице Employee.