Хранимый процесс — это одна или несколько команд SQL, хранящихся в базе данных в виде исполняемых объектов.
Определения всегда абстрактны. Хранимый процесс на самом деле представляет собой набор операторов SQL, которые могут выполнять определенные операции, но этот набор операторов размещается в базе данных (здесь мы говорим только о SQL SERVER). Если мы создадим хранимый процесс и вызовем его в ASP, мы сможем избежать смешивания операторов SQL с кодом ASP. У этого есть как минимум три преимущества:
Во-первых, значительно повысить эффективность. Скорость выполнения самого хранимого процесса очень высока, а вызов хранимого процесса может значительно сократить количество взаимодействий с базой данных.
Во-вторых, повысить безопасность. Если вы смешиваете операторы SQL в коде ASP, то если код будет скомпрометирован, это также означает, что структура библиотеки будет скомпрометирована.
В-третьих, это способствует повторному использованию операторов SQL.
В ASP хранимые процессы обычно вызываются через объект COMMAND. В зависимости от ситуации в этой статье также представлены другие методы вызова. Для удобства объяснения на основе входных и выходных данных хранимого процесса сделаны следующие простые классификации:
1. Сохраненный процесс, который возвращает только один набор записей.
Предположим, имеется следующий хранимый процесс (цель этой статьи не состоит в описании синтаксиса T-SQL, поэтому хранимый процесс дает только код без пояснений):
/*СП1*/
СОЗДАТЬ ПРОЦЕДУРУ DBO.GETUSERLIST
КАК
УСТАНОВИТЬ NOCOUNT ON
НАЧИНАТЬ
ВЫБЕРИТЕ * ИЗ DBO.[ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ]
КОНЕЦ
ИДТИ
Вышеупомянутый хранимый процесс получает все записи в таблице USERINFO и возвращает набор записей. Код ASP для вызова хранимого процесса через объект COMMAND выглядит следующим образом:
'**Вызов хранимого процесса через объект COMMAND**
ДИМ МАЙКОММ,МИРСТ
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — это строка подключения к базе данных.
MYCOMM.COMMANDTEXT = GETUSERLIST 'Укажите имя сохраненного процесса
MYCOMM.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
MYCOMM.PREPARED = TRUE 'Требовать предварительной компиляции команд SQL
SET MYRST = MYCOMM.EXECUTE
УСТАНОВИТЬ MYCOMM = НИЧЕГО
Набор записей, полученный в процессе хранения, назначается MYRST. Далее можно работать с MYRST.
В приведенном выше коде атрибут COMMANDTYPE указывает тип запроса. Значение и описание следующие:
-1 указывает, что тип параметра COMMANDTEXT не может быть определен.
1 указывает, что COMMANDTEXT является общим типом команды.
2 указывает, что параметр COMMANDTEXT представляет собой имя таблицы с
4 указывает, что параметр COMMANDTEXT является именем хранимого процесса.
Вы также можете вызвать хранимый процесс через объект CONNECTION или объект RECORDSET. Существуют следующие методы:
'**Вызов хранимого процесса через объект CONNECTION**
ДИММИКОНН, МИРСТ
SET MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR — строка подключения к базе данных.
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'Последний параметр имеет то же значение, что и COMMANDTYPE
УСТАНОВИТЬ MYCONN = НИЧЕГО
'**Вызов хранимого процесса через объект RECORDSET**
ДИММИРСТ
SET MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST.OPEN GETUSERLIST,MYCONSTR,0,1,4
'MYCONSTR — это строка подключения к базе данных, последний параметр имеет то же значение, что и COMMANDTYPE.
2. Сохраненный процесс без ввода и вывода.
Взгляните на следующие хранимые процедуры:
/*СП2*/
СОЗДАТЬ ПРОЦЕДУРУ DBO.DELUSERALL
КАК
УСТАНОВИТЬ NOCOUNT ON
НАЧИНАТЬ
УДАЛИТЬ ИЗ DBO.[ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ]
КОНЕЦ
ИДТИ
Этот хранимый процесс удаляет все записи в таблице USERINFO без какого-либо ввода или вывода. Метод вызова в основном такой же, как указано выше, за исключением того, что нет необходимости получать набор записей:
'**Вызов хранимого процесса через объект COMMAND**
ДИММИКОММ
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — это строка подключения к базе данных.
MYCOMM.COMMANDTEXT = DELUSERALL 'Укажите имя сохраненного процесса
MYCOMM.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
MYCOMM.PREPARED = TRUE 'Требовать предварительной компиляции команд SQL
MYCOMM.EXECUTE 'Нет необходимости получать набор записей здесь
УСТАНОВИТЬ MYCOMM = НИЧЕГО
Конечно, этот тип хранимого процесса также можно вызвать через объект CONNECTION или объект RECORDSET. Однако объект RECORDSET создается для получения набора записей. Если набор записей не возвращается, используйте объект COMMAND.
3. Хранимые процедуры с возвращаемыми значениями
При выполнении операций, подобных SP2, вам следует в полной мере использовать мощные возможности обработки транзакций SQL SERVER для обеспечения согласованности данных. Более того, нам может потребоваться сохранить статус выполнения, возвращаемый процессом. Для этого измените SP2 следующим образом:
/*СП3*/
СОЗДАТЬ ПРОЦЕДУРУ DBO.DELUSERALL
КАК
УСТАНОВИТЬ NOCOUNT ON
НАЧИНАТЬ
НАЧАТЬ ТРАНЗАКЦИЮ
УДАЛИТЬ ИЗ DBO.[ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ]
ЕСЛИ @@ОШИБКА=0
НАЧИНАТЬ
СОВЕРШИТЬ ТРАНЗАКЦИЮ
ВОЗВРАТ 1
КОНЕЦ
ЕЩЕ
НАЧИНАТЬ
ОТКАТ ТРАНЗАКЦИИ
ВОЗВРАТ 0
КОНЕЦ
ВОЗВРАЩАТЬСЯ
КОНЕЦ
ИДТИ
Вышеупомянутый хранимый процесс возвращает 1 при успешном выполнении DELETE, в противном случае он возвращает 0 и выполняет операцию отката. Чтобы получить возвращаемое значение в ASP, вам необходимо использовать коллекцию PARAMETERS для объявления параметров:
'**Вызов хранимого процесса с возвращаемым значением и получение возвращаемого значения**
ДИМ МАЙКОММ, МАЙПАРА
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — это строка подключения к базе данных.
MYCOMM.COMMANDTEXT = DELUSERALL 'Укажите имя сохраненного процесса
MYCOMM.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
MYCOMM.PREPARED = TRUE 'Требовать предварительной компиляции команд SQL
'Объявляем возвращаемое значение
SET MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
МАЙКОММ.ИСПОЛНИТЬ
'Получаем возвращаемое значение
тусклая обратная стоимость
RETVALUE = MYCOMM(0) 'или RETVALUE = MYCOMM.PARAMETERS(0)
УСТАНОВИТЬ MYCOMM = НИЧЕГО
В MYCOMM.CREATEPARAMETER(RETURN,2,4) значение каждого параметра следующее:
Первый параметр (RETURE) — это имя параметра. Имя параметра может быть установлено произвольно, но обычно оно должно совпадать с именем параметра, объявленным в хранимом процессе. Вот возвращаемое значение, я обычно устанавливаю его в RETURE;
Второй параметр (2) указывает тип данных параметра. Коды конкретных типов приведены в справочнике ADO. Ниже приведены общие коды типов.
АДБИГИНТ: 20;
ДОПОЛНИТЕЛЬНЫЙ: 128;
АДБУЛЕВСКИЙ: 11;
АДЧАР: 129;
ADDBTIMESTAMP: 135;
АДЕМПТИ: 0;
АДИНТЕГЕР: 3;
АДСМАЛЛИНТ: 2;
АДТИНЬИНТ: 16;
АДВАРЧАР: 200;
В качестве возвращаемого значения можно брать только целочисленные значения, а от -1 до -99 — зарезервированные значения;
Третий параметр (4) указывает тип параметра, где 4 указывает, что это возвращаемое значение. Описание значения этого параметра следующее:
0: тип не может быть определен; 1: входной параметр; 2: входной параметр; 3: входной или выходной параметр;
Приведенный выше код ASP следует назвать полным кодом, то есть наиболее сложным кодом.
SET MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
можно упростить до
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
Его можно даже упростить, как будет объяснено позже.
Для хранимых процедур с параметрами их можно вызвать только с помощью объекта COMMAND (также есть информация, что их можно вызвать через объект CONNECTION или объект RECORDSET, но я не пробовал).
4. Сохраненный процесс с входными и выходными параметрами.
Возвращаемое значение на самом деле является специальным выходным параметром. В большинстве случаев мы используем хранимый процесс, который имеет как входные, так и выходные параметры. Например, мы хотим получить имя пользователя с определенным идентификатором в таблице информации о пользователе. В это время есть входной параметр. ---ID пользователя и выходной параметр ----имя пользователя. Сохраненный процесс, реализующий эту функцию, выглядит следующим образом:
/*СП4*/
СОЗДАТЬ ПРОЦЕДУРУ DBO.GETUSERNAME
@USERIDINT,
@USERNAME VARCHAR(40) ВЫВОД
КАК
УСТАНОВИТЬ NOCOUNT ON
НАЧИНАТЬ
ЕСЛИ @USERID НУЛЬНЫЙ ВОЗВРАТ
ВЫБЕРИТЕ @USERNAME=ИМЯ ПОЛЬЗОВАТЕЛЯ
ОТ DBO.[ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ]
ГДЕ USERID=@USERID
ВОЗВРАЩАТЬСЯ
КОНЕЦ
ИДТИ
Код ASP, вызывающий хранимый процесс, выглядит следующим образом:
'**Вызов сохраненного процесса с входными и выходными параметрами**
DIM MYCOMM,USERID,ИМЯ ПОЛЬЗОВАТЕЛЯ
ПОЛЬЗОВАТЕЛЬ=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — это строка подключения к базе данных.
MYCOMM.COMMANDTEXT = GETUSERNAME 'Укажите имя сохраненного процесса
MYCOMM.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
MYCOMM.PREPARED = TRUE 'Требовать предварительной компиляции команд SQL
'Объявляем параметры
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERNAME,200,2,40)
МАЙКОММ.ИСПОЛНИТЬ
'Получаем параметры
ИМЯ ПОЛЬЗОВАТЕЛЯ = МОЙКОММ(1)
УСТАНОВИТЬ MYCOMM = НИЧЕГО
В приведенном выше коде вы можете видеть, что в отличие от объявления возвращаемого значения, при объявлении входных параметров требуется 5 параметров, а при объявлении выходных параметров — 4 параметра. При объявлении входных параметров пятью параметрами являются: имя параметра, тип данных параметра, тип параметра, длина данных и значение параметра. При объявлении выходного параметра нет последнего параметра: значения параметра.
Особое внимание следует обратить на то: при объявлении параметров порядок должен быть таким же, как определенный в процессе хранения, а тип данных и длина каждого параметра также должны быть такими же, как определенные в процессе хранения.
Если хранимый процесс имеет несколько параметров, код ASP будет выглядеть громоздким. Чтобы упростить код, можно использовать команду With:
'**Вызов хранимого процесса с входными и выходными параметрами (упрощенный код)**
DIM MYCOMM,USERID,ИМЯ ПОЛЬЗОВАТЕЛЯ
ПОЛЬЗОВАТЕЛЬ=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
С МАЙКОММ
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — строка подключения к базе данных.
.COMMANDTEXT = GETUSERNAME 'Укажите имя сохраненного процесса
.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
.PREPARED = TRUE 'Требуется сначала скомпилировать команды SQL
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.ВЫПОЛНЯТЬ
ЗАКОНЧИТЬСЯ
ИМЯ ПОЛЬЗОВАТЕЛЯ = МОЙКОММ(1)
УСТАНОВИТЬ MYCOMM = НИЧЕГО
Если мы хотим получить имена 10 пользователей с идентификаторами от 1 до 10, нужно ли нам создавать объекты COMMAND 10 раз? Нет. Если вам нужно вызвать один и тот же хранимый процесс несколько раз, просто измените входные параметры, и вы получите другой результат:
'**Несколько вызовов одного и того же хранимого процесса**
DIM MYCOMM,USERID,ИМЯ ПОЛЬЗОВАТЕЛЯ
ИМЯ ПОЛЬЗОВАТЕЛЯ=
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
ДЛЯ ИДЕНТИФИКАТОРА ПОЛЬЗОВАТЕЛЯ = ОТ 1 ДО 10
С МАЙКОММ
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — строка подключения к базе данных.
.COMMANDTEXT = GETUSERNAME 'Укажите имя сохраненного процесса
.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
.PREPARED = TRUE 'Требуется сначала скомпилировать команды SQL
ЕСЛИ ИД ПОЛЬЗОВАТЕЛЯ = 1, ТО
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.ВЫПОЛНЯТЬ
ЕЩЕ
'Переназначаем значения входным параметрам (входные параметры и выходные параметры, значения параметров которых в этот момент не изменяются, не нужно переобъявлять)
.PARAMETERS(@USERID) = ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ
.ВЫПОЛНЯТЬ
КОНЕЦ ЕСЛИ
ЗАКОНЧИТЬСЯ
USERNAME = USERNAME + MYCOMM(1) + , 'Возможно, вам нравится использовать массив
СЛЕДУЮЩИЙ
УСТАНОВИТЬ MYCOMM = НИЧЕГО
Как видно из приведенного выше кода: при повторном вызове одного и того же хранимого процесса вам нужно только переназначить входные параметры, значения которых изменились. Этот метод имеет несколько входных и выходных параметров, и каждый вызывается только одно значение входного параметра. При возникновении изменений объем кода может быть значительно уменьшен.
5. Сохраненный процесс с возвращаемыми значениями, входными и выходными параметрами одновременно.
Как упоминалось ранее, при вызове хранимого процесса порядок объявления параметров должен быть таким же, как порядок, определенный в хранимом процессе. Еще один момент, на который следует обратить особое внимание: если хранимый процесс имеет как возвращаемое значение, так и входные и выходные параметры, то возвращаемое значение должно быть объявлено первым.
Чтобы продемонстрировать вызывающий метод в этом случае, давайте улучшим приведенный выше пример. Все равно получите имя пользователя с ID 1, но возможно, что у пользователя его нет (пользователь удален, а USERID — самоувеличяющееся поле). Сохраненный процесс возвращает разные значения в зависимости от того, есть он у пользователя или нет. На данный момент хранимый процесс и код ASP выглядят следующим образом:
/*СП5*/
СОЗДАТЬ ПРОЦЕДУРУ DBO.GETUSERNAME
--Чтобы усилить впечатление от порядка, измените порядок определения следующих двух параметров.
@USERNAME VARCHAR(40) ВЫВОД,
@USERIDINT
КАК
УСТАНОВИТЬ NOCOUNT ON
НАЧИНАТЬ
ЕСЛИ @USERID НУЛЬНЫЙ ВОЗВРАТ
ВЫБЕРИТЕ @USERNAME=ИМЯ ПОЛЬЗОВАТЕЛЯ
ОТ DBO.[ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ]
ГДЕ USERID=@USERID
ЕСЛИ @@ROWCOUNT>0
ВОЗВРАТ 1
ЕЩЕ
ВОЗВРАТ 0
ВОЗВРАЩАТЬСЯ
КОНЕЦ
ИДТИ
'**Вызов сохраненного процесса с возвращаемым значением, входными и выходными параметрами**
DIM MYCOMM,USERID,ИМЯ ПОЛЬЗОВАТЕЛЯ
ПОЛЬЗОВАТЕЛЬ=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
С МАЙКОММ
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — строка подключения к базе данных.
.COMMANDTEXT = GETUSERNAME 'Укажите имя сохраненного процесса
.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
.PREPARED = TRUE 'Требуется сначала скомпилировать команды SQL
'Возвращаемое значение должно быть объявлено первым
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'Порядок объявления следующих двух параметров также соответственно меняется на обратный.
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.ВЫПОЛНЯТЬ
ЗАКОНЧИТЬСЯ
ЕСЛИ MYCOMM(0) = 1, ТО
ИМЯ ПОЛЬЗОВАТЕЛЯ = МОЙКОММ(1)
ЕЩЕ
USERNAME = У этого пользователя нет
КОНЕЦ ЕСЛИ
УСТАНОВИТЬ MYCOMM = НИЧЕГО
6. Сохраненный процесс, который одновременно возвращает параметры и набор записей.
Иногда нам нужно, чтобы процесс хранения возвращал параметры и наборы записей одновременно. Например, при использовании процесса хранения для подкачки нам необходимо одновременно возвращать такие параметры, как наборы записей и общий объем данных. Ниже приведен хранимый процесс пейджинга:
/*СП6*/
СОЗДАТЬ ПРОЦЕДУРУ DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT, --Общее количество страниц
@IPAGE INT, --Номер текущей страницы
@IPAGESIZE INT --Количество записей на странице
КАК
УСТАНОВИТЬ NOCOUNT ON
НАЧИНАТЬ
--Создать временную таблицу
CREATE TABLE #T (ID INT IDENTITY, поле --auto-increment
ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ,
ИМЯ ПОЛЬЗОВАТЕЛЯ VARCHAR(40))
--Записать данные во временную таблицу
ВСТАВИТЬ В #T
ВЫБЕРИТЕ ИД ПОЛЬЗОВАТЕЛЯ, ИМЯ ПОЛЬЗОВАТЕЛЯ ИЗ DBO. [ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ]
ЗАКАЗАТЬ ПО ИДЕНТИФИКАТУ ПОЛЬЗОВАТЕЛЯ
--Получить общее количество записей
ОБЪЯВИТЬ @IRECORDCOUNT INT
SET @IRECORDCOUNT = @@ROWCOUNT
--Определить общее количество страниц
ЕСЛИ @IRECORDCOUNT%@IPAGESIZE=0
SET @IPAGECOUNT=ПОТОЛОК(@IRECORDCOUNT/@IPAGESIZE)
ЕЩЕ
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1
--Если номер запрошенной страницы превышает общее количество страниц, будет отображена последняя страница.
ЕСЛИ @IPAGE > @IPAGECOUNT
ВЫБЕРИТЕ @IPAGE = @IPAGECOUNT
--Определить начало и конец записи текущей страницы
DECLARE @ISTART INT --НАЧАТЬ ЗАПИСЬ
DECLARE @IEND INT --КОНЕЦ ЗАПИСИ
ВЫБЕРИТЕ @ISTART = (@IPAGE - 1) * @IPAGESIZE
ВЫБЕРИТЕ @IEND = @ISTART + @IPAGESIZE + 1
--Получить текущую запись страницы
ВЫБЕРИТЕ * ИЗ #T WHERE ID>@ISTART И ID<@IEND
--Удалить временную таблицу
СБРОСИТЬ СТОЛ #T
--Вернуть общее количество записей
ВОЗВРАТ @IRECORDCOUNT
КОНЕЦ
ИДТИ
В описанном выше процессе хранения введите номер текущей страницы и количество записей на странице и верните набор записей текущей страницы, общее количество страниц и общее количество записей. Чтобы быть более типичным, общее количество записей возвращается в качестве возвращаемого значения. Ниже приведен код ASP, вызывающий хранимый процесс (конкретная операция подкачки опущена):
'**Процесс хранения пейджингового вызова**
DIM PAGENOW, PAGESIZE, PAGECOUNT, RECORDCOUNT
ДИМ МАЙКОММ,МИРСТ
PAGENOW = ЗАПРОС (PN)
'Пользовательская функция, используемая для проверки натуральных чисел
ЕСЛИ CHECKNAR(PAGENOW) = FALSE, ТОГДА PAGENOW = 1
РАЗМЕР СТРАНИЦЫ = 20
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
С МАЙКОММ
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — строка подключения к базе данных.
.COMMANDTEXT = GETUSERLIST 'Укажите имя сохраненного процесса
.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
.PREPARED = TRUE 'Требуется сначала скомпилировать команды SQL
'Возвращаемое значение (общее количество записей)
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'Выходные параметры (общее количество страниц)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'Входные параметры (номер текущей страницы)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGE,3,1,4,PAGENOW)
'Входные параметры (количество записей на странице)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGESIZE,3,1,4,PAGESIZE)
УСТАНОВИТЬ МИРСТ = .ВЫПОЛНИТЬ
ЗАКОНЧИТЬСЯ
IF MYRST.STATE = 0 THEN 'Данные не получены, MYRST закрыт
СЧЕТ ЗАПИСИ = -1
ЕЩЕ
MYRST.CLOSE 'Примечание. Чтобы получить значения параметров, необходимо сначала закрыть объект набора записей.
СЧЕТ ЗАПИСИ = МОЙКОММ(0)
СЧЕТ СТРАНИЦ = МОЙКОММ(1)
IF CINT(PAGENOW)>=CINT(PAGECOUNT) THEN PAGENOW=PAGECOUNT
КОНЕЦ ЕСЛИ
УСТАНОВИТЬ MYCOMM = НИЧЕГО
'Показать записи ниже
ЕСЛИ СЧЕТ ЗАПИСИ = 0, ТО
ОТВЕТ.ЗАПИСЬ Нет записи
ELSEIF RECORDCOUNT > 0 ТОГДА
МИРСТ.ОТКРЫТЫЙ
ДЕЛАТЬ ДО MYRST.EOF
...
ПЕТЛЯ
'Следующее отображает информацию о пейджинге
...
ELSE 'RECORDCOUNT=-1
Ошибка параметра RESPONSE.WRITE
КОНЕЦ ЕСЛИ
Что касается приведенного выше кода, то есть только один момент, который необходимо пояснить: при одновременном возврате набора записей и параметров, если вы хотите получить параметры, вам необходимо сначала закрыть набор записей, а затем открыть его при использовании набор записей.
7. Сохраненный процесс, возвращающий несколько наборов записей.
В этой статье сначала описывается хранимый процесс, возвращающий набор записей. Иногда хранимому процессу необходимо вернуть несколько наборов записей. Как в ASP получить эти наборы записей одновременно? Чтобы проиллюстрировать эту проблему, добавьте в таблицу USERINFO два поля: USERTEL и USERMAIL и установите, чтобы только вошедшие в систему пользователи могли просматривать эти два содержимого.
/*СП7*/
СОЗДАТЬ ПРОЦЕДУРУ DBO.GETUSERINFO
@USERIDINT,
@CHECKLOGIN БИТ
КАК
УСТАНОВИТЬ NOCOUNT ON
НАЧИНАТЬ
ЕСЛИ @USERID НУЛЬ ИЛИ @CHECKLOGIN НУЛЬ, ВОЗВРАТ
ВЫБЕРИТЕ ИМЯ ПОЛЬЗОВАТЕЛЯ
ОТ DBO.[USRINFO]
ГДЕ USERID=@USERID
--Если вы вошли в систему, возьмите USERTEL и USERMAIL.
ЕСЛИ @CHECKLOGIN=1
ВЫБЕРИТЕ USERTEL, USERMAIL
ОТ DBO.[ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ]
ГДЕ USERID=@USERID
ВОЗВРАЩАТЬСЯ
КОНЕЦ
ИДТИ
Ниже приведен код ASP:
'**Вызов хранимого процесса, который возвращает несколько наборов записей**
DIM CHECKLG,USERID,ИМЯ ПОЛЬЗОВАТЕЛЯ,USERTEL,USERMAIL
ДИМ МАЙКОММ,МИРСТ
ПОЛЬЗОВАТЕЛЬ=1
'CHECKLOGIN() — это пользовательская функция, позволяющая определить, вошел ли посетитель в систему.
ПРОВЕРКА = ПРОВЕРКА ВХОД()
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
С МАЙКОММ
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR — строка подключения к базе данных.
.COMMANDTEXT = GETUSERINFO 'Укажите имя сохраненного процесса
.COMMANDTYPE = 4 'Указывает, что это хранимый процесс
.PREPARED = TRUE 'Требуется сначала скомпилировать команды SQL
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
УСТАНОВИТЬ МИРСТ = .ВЫПОЛНИТЬ
ЗАКОНЧИТЬСЯ
УСТАНОВИТЬ MYCOMM = НИЧЕГО
'Получаем значение из первого набора записей
ИМЯ ПОЛЬЗОВАТЕЛЯ = МИРСТ(0)
'Получаем значение из второго набора записей
ЕСЛИ НЕ МИРСТ, ЭТО НИЧТО, ТОГДА
УСТАНОВИТЬ МИРСТ = МИРСТ.NEXTRECORDSET()
USERTEL = МИРСТ(0)
ПОЛЬЗОВАТЕЛЬСКАЯ ПОЧТА = МИРСТ(1)
КОНЕЦ ЕСЛИ
УСТАНОВИТЬ МИРСТ = НИЧЕГО
В приведенном выше коде метод NEXTRECORDSET объекта RECORDSET используется для получения нескольких наборов записей, возвращаемых процессом хранения.
До сих пор в этой статье давалось относительно полное объяснение различных ситуаций, в которых ASP вызывает хранимые процессы. Наконец, давайте поговорим о различных методах вызова нескольких хранимых процессов в программе ASP.
В программе ASP возможны как минимум следующие три метода для вызова нескольких хранимых процессов:
1. Создайте несколько объектов COMMAND.
ДИММИКОММ
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Вызов хранимого процесса номер один
...
УСТАНОВИТЬ MYCOMM = НИЧЕГО
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Вызов сохраненного процесса два
...
УСТАНОВИТЬ MYCOMM = НИЧЕГО
...
2. Создайте только один объект COMMAND и очистите его параметры при завершении вызова.
ДИММИКОММ
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Вызов хранимого процесса номер один
.....
'Очистить параметры (при условии, что их три)
MYCOMM.ПАРАМЕТРЫ.УДАЛЕНИЕ 2
MYCOMM.ПАРАМЕТРЫ.УДАЛЕНИЕ 1
MYCOMM.ПАРАМЕТРЫ.УДАЛЕНИЕ 0
'Вызов сохраненного процесса два и очистка параметров
...
УСТАНОВИТЬ MYCOMM = НИЧЕГО
На этот раз обратите внимание: порядок очистки параметров противоположен порядку объявления параметров. Причина неизвестна.
3. Используйте метод REFRESH коллекции данных PARAMETERS для сброса объекта PARAMETER.
ДИММИКОММ
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Вызов хранимого процесса номер один
.....
'Сбрасываем все объекты PARAMETER, содержащиеся в коллекции данных PARAMETERS
MYCOMM.ПАРАМЕТРЫ.ОБНОВИТЬ
'Вызов сохраненного процесса два
.....
УСТАНОВИТЬ MYCOMM = НИЧЕГО
Принято считать, что повторное создание объектов — менее эффективный метод, но после тестирования (инструмент тестирования — MICROSOFT APPLICATION CENTER TEST) результаты оказались неожиданными:
Метод 2 >= Метод 1 >> Метод 3
Скорость работы метода 2 больше или равна методу 1 (примерно на 4 %). Скорость работы этих двух методов намного выше, чем метода 3 (до 130 %). метод 1, если параметров много. Если нет, используйте метод 2.
Мне потребовался день, чтобы наконец описать свой поверхностный опыт вызова хранимых процедур в ASP. Среди них у некоторых я знаю только следствия, но не причины, а некоторые могут быть неправильными, но все они получены на основе моей личной практики. Пожалуйста, отнеситесь к этому критически, читатели. Если у вас есть другое мнение, пожалуйста, дайте мне знать. Заранее спасибо.