Um processo armazenado é um ou mais comandos SQL armazenados no banco de dados como objetos executáveis.
As definições são sempre abstratas. Um processo armazenado é na verdade um conjunto de instruções SQL que podem completar determinadas operações, mas esse conjunto de instruções é colocado no banco de dados (aqui falamos apenas sobre SQL SERVER). Se criarmos um processo armazenado e chamarmos o processo armazenado em ASP, poderemos evitar misturar instruções SQL com código ASP. Há pelo menos três benefícios em fazer isso:
Primeiro, melhore muito a eficiência. A velocidade de execução do processo armazenado em si é muito rápida e chamar o processo armazenado pode reduzir bastante o número de interações com o banco de dados.
Em segundo lugar, melhore a segurança. Se você misturar instruções SQL em código ASP, uma vez que o código seja comprometido, isso também significa que a estrutura da biblioteca será comprometida.
Terceiro, é propício à reutilização de instruções SQL.
No ASP, os processos armazenados geralmente são chamados através do objeto COMMAND Dependendo da situação, este artigo também apresenta outros métodos de chamada. Para facilitar a explicação, as seguintes classificações simples são feitas com base na entrada e na saída do processo armazenado:
1. Um processo armazenado que retorna apenas um único conjunto de registros
Suponha que exista o seguinte processo armazenado (o objetivo deste artigo não é descrever a sintaxe T-SQL, portanto, o processo armazenado apenas fornece o código sem explicação):
/*SP1*/
CRIAR PROCEDIMENTO DBO.GETUSERLIST
COMO
DEFINIR NOCOUNT ATIVADO
COMEÇAR
SELECIONE * DO DBO.[USERINFO]
FIM
IR
O processo armazenado acima obtém todos os registros da tabela USERINFO e retorna um conjunto de registros. O código ASP para chamar o processo armazenado através do objeto COMMAND é o seguinte:
'**Chamar processo armazenado através do objeto COMMAND**
DIM MYCOMM,MYRST
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
MYCOMM.COMMANDTEXT = GETUSERLIST 'Especifique o nome do processo armazenado
MYCOMM.COMMANDTYPE = 4 'Indica que este é um processo armazenado
MYCOMM.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
DEFINIR MYRST = MYCOMM.EXECUTE
DEFINIR MYCOMM = NADA
O conjunto de registros obtido pelo processo de armazenamento é atribuído ao MYRST. Em seguida, o MYRST pode ser operado.
No código acima, o atributo COMMANDTYPE indica o tipo de solicitação. O valor e a descrição são os seguintes:
-1 indica que o tipo do parâmetro COMMANDTEXT não pode ser determinado
1 indica que COMMANDTEXT é um tipo de comando geral
2 indica que o parâmetro COMMANDTEXT é um nome de tabela com
4 indica que o parâmetro COMMANDTEXT é o nome de um processo armazenado
Você também pode chamar o processo armazenado por meio do objeto CONNECTION ou do objeto RECORDSET. Os métodos são os seguintes:
'**Chamando o processo armazenado através do objeto CONNECTION**
DIMMYCONN,MYRST
DEFINIR MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'O último parâmetro tem o mesmo significado que COMMANDTYPE
DEFINIR MYCONN = NADA
'**Chamando o processo armazenado através do objeto RECORDSET**
DIMMYRST
DEFINIR MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST.OPEN GETUSERLIST,MYCONSTR,0,1,4
'MYCONSTR é a string de conexão do banco de dados, o último parâmetro tem o mesmo significado que COMMANDTYPE
2. Processo armazenado sem entrada e saída
Dê uma olhada nos seguintes procedimentos armazenados:
/*SP2*/
CRIAR PROCEDIMENTO DBO.DELUSERALL
COMO
DEFINIR NOCOUNT ATIVADO
COMEÇAR
EXCLUIR DO DBO.[USERINFO]
FIM
IR
Este processo armazenado exclui todos os registros da tabela USERINFO sem qualquer entrada ou saída. O método de chamada é basicamente o mesmo mencionado acima, exceto que não há necessidade de obter o conjunto de registros:
'**Chamar processo armazenado através do objeto COMMAND**
DIMMYCOMM
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
MYCOMM.COMMANDTEXT = DELUSERALL 'Especifique o nome do processo armazenado
MYCOMM.COMMANDTYPE = 4 'Indica que este é um processo armazenado
MYCOMM.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
MYCOMM.EXECUTE 'Não há necessidade de obter o registro definido aqui
DEFINIR MYCOMM = NADA
Claro, este tipo de processo armazenado também pode ser chamado através do objeto CONNECTION ou do objeto RECORDSET. No entanto, o objeto RECORDSET é criado para obter o conjunto de registros. Se o conjunto de registros não for retornado, use o objeto COMMAND.
3. Procedimentos armazenados com valores de retorno
Ao executar operações semelhantes ao SP2, você deve aproveitar ao máximo os poderosos recursos de processamento de transações do SQL SERVER para manter a consistência dos dados. Além disso, podemos precisar armazenar o status de execução retornado pelo processo. Para isso, modifique o SP2 da seguinte forma:
/*SP3*/
CRIAR PROCEDIMENTO DBO.DELUSERALL
COMO
DEFINIR NOCOUNT ATIVADO
COMEÇAR
INICIAR TRANSAÇÃO
EXCLUIR DO DBO.[USERINFO]
SE @@ERRO=0
COMEÇAR
COMPROMETIR TRANSAÇÃO
RETORNO 1
FIM
OUTRO
COMEÇAR
TRANSAÇÃO DE REVERSÃO
RETORNAR 0
FIM
RETORNAR
FIM
IR
O processo armazenado acima retorna 1 quando DELETE é executado com sucesso, caso contrário, retorna 0 e executa a operação de rollback. Para obter o valor de retorno em ASP, você precisa usar a coleção PARAMETERS para declarar parâmetros:
'**Chame um processo armazenado com um valor de retorno e obtenha o valor de retorno**
DIM MYCOMM, MYPARA
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
MYCOMM.COMMANDTEXT = DELUSERALL 'Especifique o nome do processo armazenado
MYCOMM.COMMANDTYPE = 4 'Indica que este é um processo armazenado
MYCOMM.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
'Declara valor de retorno
DEFINIR MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARÂMETROS.ANEXAR MYPARA
MYCOMM.EXECUTE
'Obtém o valor de retorno
RETVALOR DIM
RETVALUE = MYCOMM(0) 'ou RETVALUE = MYCOMM.PARAMETERS(0)
DEFINIR MYCOMM = NADA
Em MYCOMM.CRATEPARAMETER(RETURN,2,4), o significado de cada parâmetro é o seguinte:
O primeiro parâmetro (RETURE) é o nome do parâmetro. O nome do parâmetro pode ser definido arbitrariamente, mas geralmente deve ser igual ao nome do parâmetro declarado no processo armazenado. Aqui está o valor de retorno, normalmente defino como RETURE;
O segundo parâmetro (2) indica o tipo de dados do parâmetro. Consulte a referência ADO para obter códigos de tipo específicos abaixo:
ADBIGINT: 20;
ADBINÁRIO: 128;
ADBOLEANO: 11;
ADCHAR: 129;
ADDBTIMESTAMP: 135;
ADEMPTY: 0;
ADINTEGER: 3;
ADSMALLINT: 2;
ADTINYINT: 16;
ADVARCHAR: 200;
Para o valor de retorno, apenas valores inteiros podem ser obtidos e -1 a -99 são valores reservados;
O terceiro parâmetro (4) indica a natureza do parâmetro, onde 4 indica que este é um valor de retorno. A descrição do valor deste parâmetro é a seguinte:
0: O tipo não pode ser determinado; 1: Parâmetro de entrada 2: Parâmetro de entrada 3: Parâmetro de entrada ou saída 4: Valor de retorno;
O código ASP fornecido acima deve ser considerado o código completo, ou seja, o código mais complexo.
DEFINIR MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARÂMETROS.ANEXAR MYPARA
pode ser simplificado para
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
Pode até ser simplificado ainda mais, como será explicado mais adiante.
Para procedimentos armazenados com parâmetros, eles só podem ser chamados através do objeto COMMAND (também há informações de que podem ser chamados através do objeto CONNECTION ou do objeto RECORDSET, mas não tentei).
4. Processo armazenado com parâmetros de entrada e parâmetros de saída
O valor de retorno é na verdade um parâmetro de saída especial. Na maioria dos casos, usamos um processo armazenado que possui parâmetros de entrada e saída. Por exemplo, queremos obter o nome de usuário de um usuário com um determinado ID na tabela de informações do usuário. ---ID do usuário e um parâmetro de saída----nome do usuário. O processo armazenado que implementa esta função é o seguinte:
/*SP4*/
CRIAR PROCEDIMENTO DBO.GETUSERNAME
@USERIDINT,
@NOME DE USUÁRIO VARCHAR(40) SAÍDA
COMO
DEFINIR NOCOUNT ATIVADO
COMEÇAR
SE @USERID FOR NULO RETORNE
SELECIONE @NOME DE USUÁRIO=NOME DE USUÁRIO
DE DBO.[INFORMAÇÃO DO USUÁRIO]
ONDE USERID=@USERID
RETORNAR
FIM
IR
O código ASP que chama o processo armazenado é o seguinte:
'**Chama um processo armazenado com parâmetros de entrada e saída**
DIM MYCOMM,USERID,NOME DE USUÁRIO
ID DO USUÁRIO=1
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
MYCOMM.COMMANDTEXT = GETUSERNAME 'Especifique o nome do processo armazenado
MYCOMM.COMMANDTYPE = 4 'Indica que este é um processo armazenado
MYCOMM.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
'Declara parâmetros
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERNAME,200,2,40)
MYCOMM.EXECUTE
'Pegue os parâmetros
NOME DE USUÁRIO = MEUCOMM(1)
DEFINIR MYCOMM = NADA
No código acima, você pode ver que, diferentemente da declaração de um valor de retorno, 5 parâmetros são necessários ao declarar parâmetros de entrada e 4 parâmetros são necessários ao declarar parâmetros de saída. Ao declarar parâmetros de entrada, os cinco parâmetros são: nome do parâmetro, tipo de dados do parâmetro, tipo de parâmetro, comprimento dos dados e valor do parâmetro. Ao declarar um parâmetro de saída, não existe um último parâmetro: o valor do parâmetro.
Atenção especial deve ser dada: ao declarar parâmetros, a ordem deve ser a mesma definida no processo de armazenamento, e o tipo de dados e comprimento de cada parâmetro também devem ser iguais aos definidos no processo de armazenamento.
Se o processo armazenado tiver vários parâmetros, o código ASP parecerá complicado. Você pode usar o comando WITH para simplificar o código:
'**Chama um processo armazenado com parâmetros de entrada e saída (código simplificado)**
DIM MYCOMM,USERID,NOME DE USUÁRIO
ID DO USUÁRIO=1
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
COM MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
.COMMANDTEXT = GETUSERNAME 'Especifique o nome do processo armazenado
.COMMANDTYPE = 4 'Indica que este é um processo armazenado
.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
.PARAMETERS.APPEND .CRATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CRATEPARAMETER(@USERNAME,200,2,40)
.EXECUTAR
TERMINAR COM
NOME DE USUÁRIO = MEUCOMM(1)
DEFINIR MYCOMM = NADA
Se quisermos obter os nomes de usuário de 10 usuários com IDs de 1 a 10, precisamos criar objetos COMMAND 10 vezes? Não. Se você precisar chamar o mesmo processo armazenado várias vezes, basta alterar os parâmetros de entrada e você obterá uma saída diferente:
'**Várias chamadas para o mesmo processo armazenado**
DIM MYCOMM,USERID,NOME DE USUÁRIO
NOME DE USUÁRIO =
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
PARA USERID = 1 A 10
COM MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
.COMMANDTEXT = GETUSERNAME 'Especifique o nome do processo armazenado
.COMMANDTYPE = 4 'Indica que este é um processo armazenado
.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
SE USERID = 1 ENTÃO
.PARAMETERS.APPEND .CRATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CRATEPARAMETER(@USERNAME,200,2,40)
.EXECUTAR
OUTRO
'Reatribuir valores aos parâmetros de entrada (parâmetros de entrada e parâmetros de saída cujos valores de parâmetros não mudam neste momento não precisam ser declarados novamente)
.PARAMETERS(@USERID) = USERID
.EXECUTAR
TERMINAR SE
TERMINAR COM
USERNAME = USERNAME + MYCOMM(1) + , 'Talvez você goste de usar armazenamento em array
PRÓXIMO
DEFINIR MYCOMM = NADA
Como pode ser visto no código acima: ao chamar o mesmo processo armazenado repetidamente, você só precisa reatribuir os parâmetros de entrada cujos valores foram alterados. Este método possui vários parâmetros de entrada e saída, e apenas um valor de parâmetro de entrada é chamado cada. tempo Quando ocorrem alterações, a quantidade de código pode ser significativamente reduzida.
5. Um processo armazenado com valores de retorno, parâmetros de entrada e parâmetros de saída ao mesmo tempo
Conforme mencionado anteriormente, ao chamar um processo armazenado, a ordem em que os parâmetros são declarados deve ser a mesma ordem definida no processo armazenado. Outro ponto ao qual devemos prestar atenção especial: se o processo armazenado tiver um valor de retorno e parâmetros de entrada e saída, o valor de retorno deverá ser declarado primeiro.
Para demonstrar o método de chamada neste caso, vamos melhorar o exemplo acima. Ainda obtemos o nome de usuário do usuário com ID 1, mas é possível que o usuário não o tenha (o usuário foi excluído e USERID é um campo de aumento automático). O processo armazenado retorna valores diferentes dependendo se o usuário o possui ou não. Neste ponto, o processo armazenado e o código ASP são os seguintes:
/*SP5*/
CRIAR PROCEDIMENTO DBO.GETUSERNAME
--Para aprofundar a impressão do pedido, inverta a ordem de definição dos dois parâmetros a seguir.
@NOME DE USUÁRIO VARCHAR(40) SAÍDA,
@USERIDINT
COMO
DEFINIR NOCOUNT ATIVADO
COMEÇAR
SE @USERID FOR NULO RETORNE
SELECIONE @NOME DE USUÁRIO=NOME DE USUÁRIO
DE DBO.[INFORMAÇÃO DO USUÁRIO]
ONDE USERID=@USERID
SE @@ROWCOUNT>0
RETORNO 1
OUTRO
RETORNAR 0
RETORNAR
FIM
IR
'**Chama um processo armazenado com valor de retorno, parâmetros de entrada e parâmetros de saída**
DIM MYCOMM,USERID,NOME DE USUÁRIO
ID DO USUÁRIO=1
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
COM MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
.COMMANDTEXT = GETUSERNAME 'Especifique o nome do processo armazenado
.COMMANDTYPE = 4 'Indica que este é um processo armazenado
.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
'O valor de retorno deve ser declarado primeiro
.PARAMETERS.APPEND .CRATEPARAMETER(RETURN,2,4)
'A ordem de declaração dos dois parâmetros a seguir também é invertida de acordo.
.PARAMETERS.APPEND .CRATEPARAMETER(@USERNAME,200,2,40)
.PARAMETERS.APPEND .CRATEPARAMETER(@USERID,3,1,4,USERID)
.EXECUTAR
TERMINAR COM
SE MEUCOMM(0) = 1 ENTÃO
NOME DE USUÁRIO = MEUCOMM(1)
OUTRO
USERNAME = Este usuário não possui
TERMINAR SE
DEFINIR MYCOMM = NADA
6. Processo armazenado que retorna parâmetros e conjunto de registros ao mesmo tempo
Às vezes, precisamos que o processo de armazenamento retorne parâmetros e conjuntos de registros ao mesmo tempo. Por exemplo, ao usar o processo de armazenamento para paginação, precisamos retornar parâmetros como conjuntos de registros e volume total de dados ao mesmo tempo. O seguinte é um processo armazenado para paginação:
/*SP6*/
CRIAR PROCEDIMENTO DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT, --Número total de páginas
@IPAGE INT, --Número da página atual
@IPAGESIZE INT --Número de registros por página
COMO
DEFINIR NOCOUNT ATIVADO
COMEÇAR
--Cria tabela temporária
CREATE TABLE #T (ID INT IDENTITY, --campo de incremento automático
USERID INT,
NOME DE USUÁRIO VARCHAR(40))
--Escreve dados na tabela temporária
INSERIR EM #T
SELECIONE ID DE USUÁRIO, NOME DE USUÁRIO DO DBO.[USERINFO]
PEDIDO POR ID DE USUÁRIO
--Obter o número total de registros
DECLARE @IRECORDCOUNT INT
DEFINIR @IRECORDCOUNT = @@ROWCOUNT
--Determine o número total de páginas
SE @IRECORDCOUNT%@IPAGESIZE=0
SET @IPAGECOUNT=TETO(@IRECORDCOUNT/@IPAGESIZE)
OUTRO
SET @IPAGECOUNT=TETO(@IRECORDCOUNT/@IPAGESIZE)+1
--Se o número da página solicitada for maior que o número total de páginas, a última página será exibida
SE @IPAGE > @IPAGECOUNT
SELECIONE @IPAGE = @IPAGECOUNT
--Determine os registros de início e fim da página atual
DECLARE @ISTART INT --INICIAR REGISTRO
DECLARE @IEND INT --END RECORD
SELECIONE @ISTART = (@IPAGE - 1) * @IPAGESIZE
SELECIONE @IEND = @ISTART + @IPAGESIZE + 1
--Obter o registro da página atual
SELECIONE *FROM #T ONDE ID>@ISTART E ID<@IEND
--Excluir tabela temporária
DEIXAR TABELA #T
--Retorna o número total de registros
RETORNAR @IRECORDCOUNT
FIM
IR
No processo de armazenamento acima, insira o número da página atual e o número de registros por página e retorne o conjunto de registros da página atual, o número total de páginas e o número total de registros. Para ser mais típico, o número total de registros é retornado como um valor de retorno. A seguir está o código ASP que chama o processo armazenado (a operação de paginação específica é omitida):
'**Processo de armazenamento de paginação de chamadas**
DIM PAGENOW,PAGESIZE,PAGECOUNT,RECORDCOUNT
DIM MYCOMM,MYRST
PÁGINA AGORA = PEDIDO(PN)
'Função personalizada usada para verificar números naturais
SE CHECKNAR(PAGENOW) = FALSO ENTÃO PAGENOW = 1
TAMANHO DA PÁGINA = 20
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
COM MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
.COMMANDTEXT = GETUSERLIST 'Especifique o nome do processo armazenado
.COMMANDTYPE = 4 'Indica que este é um processo armazenado
.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
'Valor de retorno (número total de registros)
.PARAMETERS.APPEND .CRATEPARAMETER(RETURN,2,4)
'Parâmetros de saída (número total de páginas)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'Parâmetros de entrada (número da página atual)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGE,3,1,4,PAGENOW)
'Parâmetros de entrada (número de registros por página)
.PARAMETERS.APPEND .CRATEPARAMETER(@IPAGESIZE,3,1,4,PAGESIZE)
DEFINIR MIRST = .EXECUTE
TERMINAR COM
IF MYRST.STATE = 0 THEN 'Nenhum dado foi obtido, MYRST está fechado
CONTAGEM DE RECORDES = -1
OUTRO
MYRST.CLOSE 'Nota: Para obter valores de parâmetros, você precisa primeiro fechar o objeto recordset
CONTAGEM DE RECORDES = MINHACOM(0)
CONTAGEM DE PÁGINAS = MINHACOM(1)
SE CINT(PAGENOW)>=CINT(PAGECOUNT) ENTÃO PAGENOW=PAGECOUNT
TERMINAR SE
DEFINIR MYCOMM = NADA
'Mostra os registros abaixo
SE RECORDCOUNT = 0 ENTÃO
RESPONSE.WRITE Sem registro
ELSEIF RECORDCOUNT> 0 ENTÃO
MYRST.ABERTO
FAÇA ATÉ MYRST.EOF
...
LAÇO
'O seguinte exibe informações de paginação
...
ELSE 'RECORDCOUNT=-1
Erro no parâmetro RESPONSE.WRITE
TERMINAR SE
Em relação ao código acima, há apenas um ponto que precisa ser explicado: ao retornar o conjunto de registros e os parâmetros ao mesmo tempo, se você deseja obter os parâmetros, é necessário primeiro fechar o conjunto de registros e depois abri-lo ao usar o conjunto de registros.
7. Processo armazenado que retorna vários conjuntos de registros
Este artigo apresenta primeiro o processo armazenado que retorna um conjunto de registros. Às vezes, um processo armazenado precisa retornar vários conjuntos de registros. No ASP, como obter esses conjuntos de registros ao mesmo tempo? Para ilustrar este problema, adicione dois campos à tabela USERINFO: USERTEL e USERMAIL, e defina que apenas usuários logados possam visualizar esses dois conteúdos.
/*SP7*/
CRIAR PROCEDIMENTO DBO.GETUSERINFO
@USERIDINT,
@CHECKLOGIN
COMO
DEFINIR NOCOUNT ATIVADO
COMEÇAR
SE @USERID FOR NULO OU @CHECKLOGIN FOR NULO RETORNE
SELECIONE NOME DE USUÁRIO
DE DBO.[USRINFO]
ONDE USERID=@USERID
--Se você for um usuário logado, pegue USERTEL e USERMAIL
SE @CHECKLOGIN=1
SELECIONE USERTEL,USERMAIL
DE DBO.[INFORMAÇÃO DO USUÁRIO]
ONDE USERID=@USERID
RETORNAR
FIM
IR
A seguir está o código ASP:
'**Chama um processo armazenado que retorna vários conjuntos de registros**
DIM CHECKLG,USERID,NOME DE USUÁRIO,USERTEL,USERMAIL
DIM MYCOMM,MYRST
ID DO USUÁRIO=1
'CHECKLOGIN() é uma função personalizada para determinar se o visitante está logado
CHECKLG = CHECKLOGIN()
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
COM MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR é a string de conexão do banco de dados
.COMMANDTEXT = GETUSERINFO 'Especifique o nome do processo armazenado
.COMMANDTYPE = 4 'Indica que este é um processo armazenado
.PREPARED = TRUE 'Requer que comandos SQL sejam compilados primeiro
.PARAMETERS.APPEND .CRATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
DEFINIR MIRST = .EXECUTE
TERMINAR COM
DEFINIR MYCOMM = NADA
'Obtém o valor do primeiro conjunto de registros
NOME DE USUÁRIO = MYRST(0)
'Obtém o valor do segundo conjunto de registros
SE NÃO MYRST NÃO É NADA ENTÃO
DEFINIR MIRST = MIRST.NEXTRECORDSET()
USERTEL = MIRST(0)
E-MAIL DE USUÁRIO = MYRST(1)
TERMINAR SE
DEFINIR MYRST = NADA
No código acima, o método NEXTRECORDSET do objeto RECORDSET é usado para obter vários conjuntos de registros retornados pelo processo de armazenamento.
Até agora, este artigo forneceu uma explicação relativamente abrangente de diversas situações nas quais o ASP chama processos armazenados. Finalmente, vamos falar sobre os diferentes métodos de chamada de vários processos armazenados em um programa ASP.
Em um programa ASP, pelo menos os três métodos a seguir são viáveis para chamar vários processos armazenados:
1. Crie vários objetos COMMAND
DIMMYCOMM
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Chama o processo armazenado um
...
DEFINIR MYCOMM = NADA
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Chama o processo armazenado dois
...
DEFINIR MYCOMM = NADA
...
2. Crie apenas um objeto COMMAND e limpe seus parâmetros ao encerrar uma chamada.
DIMMYCOMM
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Chama o processo armazenado um
.....
'Limpar parâmetros (assumindo que existem três parâmetros)
MYCOMM.PARÂMETROS.DELETE 2
MYCOMM.PARÂMETROS.DELETE 1
MYCOMM.PARAMETERS.DELETE 0
'Chama o processo armazenado dois e limpa os parâmetros
...
DEFINIR MYCOMM = NADA
Neste momento, observe: a ordem de limpeza dos parâmetros é oposta à ordem de declaração dos parâmetros. Não sei o motivo.
3. Use o método REFRESH da coleta de dados PARAMETERS para redefinir o objeto PARAMETER
DIMMYCOMM
DEFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Chama o processo armazenado um
.....
'Reinicia todos os objetos PARAMETER contidos na coleção de dados PARAMETERS
MYCOMM.PARÂMETROS.REFRESH
'Chama o processo armazenado dois
.....
DEFINIR MYCOMM = NADA
Geralmente, acredita-se que a criação repetida de objetos é um método menos eficiente, mas após o teste (a ferramenta de teste é o MICROSOFT APPLICATION CENTER TEST), os resultados são inesperados:
Método 2 >= Método 1 >> Método 3
A velocidade de execução do método 2 é maior ou igual ao método 1 (até cerca de 4% maior). A velocidade de execução desses dois métodos é muito mais rápida que a do método 3 (até 130%). método 1 quando houver muitos parâmetros. Caso contrário, use o método 2.
Levei um dia para finalmente escrever um pouco da minha experiência superficial em chamar procedimentos armazenados em ASP. Entre eles, alguns deles eu só conheço os efeitos, mas não as causas, e alguns podem estar errados, mas tudo isso ocorre através da minha prática pessoal. Por favor, aceitem-no criticamente, leitores. Se você tiver alguma opinião diferente, por favor me avise. Agradecemos antecipadamente.