Eu sou novo no MySQL Stored Procedure, na minha primeira tentativa, obtive os seguintes problemas,
Procedimento armazenado:
Delimiter $$
create procedure accountstatus
(
IN inmode varchar(27),
IN AccountStatus_id int,
IN AccountStatus varchar(255),
IN CreatedOn datetime,
IN CreatedBy varchar(255),
IN UpdatedOn datetime,
IN UpdatedBy varchar(255),
IN is_active bit)
Begin
if inmode = 'insert'
then
insert into accountstatus
(AccountStatus_id, Account_Status, CreatedOn, CreatedBy, UpdatedOn, UpdatedBy, is_active)
values
(AccountStatus_id, Account_Status, CreatedOn, CreatedBy, UpdatedOn, UpdatedBy, is_active);
end if;
/*update*/
if inmode = 'update'
then
update accountstatus acc
set
acc.AccountStatus_id = AccountStatus_id,
acc.Account_Status = Account_Status,
acc.CreatedOn = CreatedOn,
acc.CreatedBy = CreatedBy,
acc.UpdatedOn = UpdatedOn,
acc.UpdatedBy = UpdatedBy,
acc.is_active = is_active
where
acc.AccountStatus_id = AccountStatus_id;
end if;
/*delete*/
if inmode = 'delete'
then
update accountstatus acc
set
acc.AccountStatus_id = AccountStatus_id,
acc.is_active = 0
where
acc.AccountStatus_id = AccountStatus_id;
end if;
/*select*/
if inmode = 'select'
then
select * from accountstatus acc
where
acc.AccountStatus_id = AccountStatus_id;
end if;
end
Quando executo essas instruções, recebo a seguinte saída:
DECLARAÇÃO
call accountstatus ('insert', 1, 'accepted', current_date(),'rathish', current_date(), 'raj', 1);
RESULTADO
call accountstatus ('insert', 8, 'accepted', current_date(),'rathish', current_date(), 'raj', 1)
1 row(s) affected
Da mesma forma, inseri alguns valores nesta tabela, mas quando tentei executar a seguinte instrução de atualização, os valores em Account_Status tornaram-se nulos conforme mostrado abaixo,
DECLARAÇÃO
call accountstatus ('update', 8, 'accepted', current_date(),'raj', current_date(), 'raj', 1);
RESULTADO
call accountstatus ('update', 8, 'accepted', current_date(),'raj', current_date(), 'raj', 1)
1 row(s) affected
Mas, quando executo a seguinte instrução de consulta, recebo a saída inesperada da seguinte forma,
- O que é erro neste procedimento?
- Existe alguma outra maneira de implementar esse procedimento?
- Como isso afetará o desempenho do banco de dados?
Desde já, obrigado.
QUESTÃO 1
Você parece ter alguma confusão de escopo nas variáveis
RESPOSTA À PERGUNTA Nº 1
PROBLEMA : Seus parâmetros têm nomes idênticos aos nomes das colunas nas tabelas. Isso pode produzir alguns resultados imprevisíveis.
SOLUÇÃO : Alterar os nomes dos parâmetros para que sejam distintos dos nomes das colunas
CAVEAT : Observe que comentei duas linhas
QUESTÃO 2
RESPOSTA À PERGUNTA Nº 2
Você poderia usar gatilhos
Aug 15, 2011
: Desempenho de um Trigger vs Procedimento Armazenado no MySQLApr 06, 2012
: Como acelerar o gatilho de auditoria?QUESTÃO 3
RESPOSTA À PERGUNTA Nº 3
Fazer operações em massa pode tornar o processo do servidor MySQL um trabalho tedioso e atolá-lo. Aqui estão outras postagens mostrando como usar o SQL com eficiência para substituir um gatilho e um procedimento armazenado, por que muitos gatilhos podem ser ruins e como usar o mínimo de código possível
Aug 11, 2011
: Acionadores do banco de dados RE de políticas em aplicativos bem projetados?Aug 12, 2011
: Desempenho de um Trigger vs Procedimento Armazenado no MySQLDec 23, 2011
: Como configurar gatilhos no MySQL para copiar um campoEPÍLOGO
Quanto mais simples o código no Stored Procedure ou Trigger, menor o impacto no desempenho, especialmente em INSERTs, UPDATEs e DELETEs em massa.
Considere o mecanismo de armazenamento e suas características de bloqueio (usando MyISAM) ao usar gatilhos e o comportamento de confirmação automática (se estiver usando InnoDB).
O erro é que você está usando um nome de parâmetro não declarado para
AccountStatus
valores.Abaixo está sua declaração para
AccountStatus
:Mas em sua instrução de atualização e inserção, você está usando
Account_Status
. Isso está tirando do valor da coluna do banco de dados.