Хранимые процедуры и ColdFusion MX

Большинство ColdFusion приложений ориентированы на базы данных. Эффективность и безопасность CF приложений зависит от того, на сколько эффективны и безопасны обращения к базе данных. Достичь этого помогают хранимые процедуры. В оригинальной статье приводятся примеры использования хранимых процедур в Oracle, MS SQL Server и MS Access, но поскольку мне знаком только MS SQL Server и я не могу говорить о том, чего не знаю, то в данной статье речь пойдет только о MS SQL Server.

 

Что такое хранимые процедуры?

Хранимая процедура - это набор SQL-инструкций, которые под определенным названием хранятся в базе данных в откомпилированном виде, и которые можно использовать в нескольких приложениях. В хранимых процедурах могут быть не только выражения Select, Insert, Update и Delete, но и инкапсулированный процедурный код. Именно откомпилированные и инкапсулированные процедуры могут предоставлять более эффективный и безопасный доступ к данным.

Каждый раз, когда вы осуществляете запрос к базе данных, база данных проделывает два действия: компилирует выражение запроса, выполняет его. В процессе компиляции происходит отдельный анализ: определение таблиц и связей между ними, определение используемых индексов и когда объединять и фильтровать набор записей. Например посмотрите на Рисунке 1 план обработки выражения:

План обработки SQL-выражения
Рисунок 1. План обработки SQL-выражения.

Этот план выполнения запроса показывает простой запрос, который объединят данные из 5 таблиц, используя внешние объединения (outer join). При вызове такого запроса с помощью тега <cfquery>, он каждый раз будет компилироваться по новому. Хранимая процедура хранится уже в откомпилированном виде, что дает значительный прирост производительности.

Явные преимущества использования хранимых процедур:

Если в вашем приложении все запросы к базе данных происходят только с помощью хранимых процедур, то вы можете ограничить доступ к данному источнику данных. Это можно сделать в Административной оболочке ColdFusion сервера. В расширенных свойствах источника данных следует указать в пункте Allowed SQL, что с помощью данного источника данных можно выполнять только хранимые процедуры.

 

Подготовимся к выполнению практических упражнений

Этот SQL крипт поможет вам создать в своем MS SQL Server'е таблицы с данными, необходимые для выполнения практического упражнения:
Создайте тестовую базу данных, а в ней, с помощью Query Analyzer'а, создайте таблицы с данными, запустив в нем этот скрипт.

Затем в Административной оболочке ColdFusion сервера создайте источник данных для только что созданной базы данных и назовите его 'sqltst'.

 

Добавляем данные в базу данных с помощью хранимой процедуры

В первом примере мы создам хранимую процедуру, которая будет вставлять новую запись в таблицу 'Books' (Рисунок 2).

 Таблица 'Books'
Рисунок 2. Таблица 'Books'.

Хранимая процедура будет принимать три параметра, а возвращать один - значение поля BookID только что добавленной записи. Вот код этой хранимой процедуры:
Вы легко можете выполнить эту хранимую процедуру, воспользовавшись Query Analyzer'ом, но нам нужно сделать это с помощью ColdFusion. Следовательно, нужный нам CFML код будет выглядеть так:
Для вызова хранимой процедуры мы используем два CFML тега: <cfstoredproc> и <cfprocparam>. Тег <cfstoredproc> создает запрос к базе данных и как минимум требует два атрибута: procedure - имя используемой процедуры, и datasource - источник данных. Тег <cfprocparam> используется для того, чтобы передавать значения в хранимую процедуру, а также обозначать переменные, которые будут содержать значения возвращаемых данных.

В приведенном выше примере мы использовали атрибут dbvarname для того, чтобы обозначить параметры по их имени, а не по позиции. Иными словами, если мы хотим передавать параметры в хранимую процедуру в той последовательности как они провозглашаются в самой хранимой процедуре, то атрибут dbvarname использовать не нужно, и наоборот.

Атрибут cfsqltype всегда обязателен и указывает тип передаваемого или получаемого параметра. Если вы хотите передать параметр, равный определенному значению, то это значение следует указать в атрибуте value. А если вам нужно передать параметр, равный значению null, то следует указать атрибут null="yes" и значение атрибута value (если оно указано) будет проигнорировано.

Для выходного параметра мы снова используем тег <cfprocparam>, указав атрибут type="out", а также имя получаемой переменной через атрибут variable. Если параметр одновременно является входным и выходным, то следует указать type="inout". Чтобы узнать больше о тегах <cfstoredproc> и <cfprocparam>, посмотрите документацию по CFML.

 

Получаем из базы данных набор записей

Хранимые процедуры могут возвращать не только один параметр, но и целый набор записей. Вот пример процедуры, которая принимает один параметр - примерное название книги, и возвращает информацию о тех книгах, в которых встречается указанное название:
CREATE PROCEDURE sp_Search_By_Title (
  @arg_Title VARCHAR(255))
as
BEGIN
    
  SELECT
    BookID,
    Title,
    Price,
    PublishDate
  FROM
    Books
  WHERE
    Title LIKE '%' + @arg_Title + '%';        

END;
CFML код, запрашивающий данную процедуру, будет выглядеть так:
На Рисунке 3 вы можете посмотреть результат поиска.

План обработки SQL-выражения
Рисунок 3. Результат поиска, полученный из хранимой процедуры.

Имя возвращаемого набора записей мы указываем в теге <cfprocresult>. Поскольку хранимая процедура может возвращать несколько наборов записей, то, соответственно, мы можем использовать несколько тегов <cfprocresult>, указывая в них разные имена наборов записей и нумеруя их атрибутом resultset в той последовательности, как они возвращаются из процедуры.

 

Заключение

В этой статье рассмотрены только основные понятия работы с хранимыми процедурами в MS SQL Server. Обратившись к документации по программированию хранимых процедур, вы узнаете, как можно усложнить их, получив взамен больше эффективности и безопасности ваших приложений.


По материалам статьи: Learning Stored Procedure Basics in ColdFusion MX

 


Hosted by uCoz