我是 MySQL 存储过程的新手,在我的第一次尝试中,我遇到了以下问题,
存储过程:
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
当我执行这些语句时,我得到以下输出:
陈述
call accountstatus ('insert', 1, 'accepted', current_date(),'rathish', current_date(), 'raj', 1);
输出
call accountstatus ('insert', 8, 'accepted', current_date(),'rathish', current_date(), 'raj', 1)
1 row(s) affected
同样,我在此表中插入了一些值,但是当我尝试执行以下更新语句时,Account_Status 中的值变为空,如下所示,
陈述
call accountstatus ('update', 8, 'accepted', current_date(),'raj', current_date(), 'raj', 1);
输出
call accountstatus ('update', 8, 'accepted', current_date(),'raj', current_date(), 'raj', 1)
1 row(s) affected
但是,当我执行以下查询语句时,我得到了以下意外输出,
- 这个过程有什么错误?
- 有没有其他方法可以实现这个过程?
- 它将如何影响数据库的性能?
提前致谢。
问题 #1
您似乎对变量有一些范围混淆
对问题 #1 的回答
问题:您的参数与表中的列名具有相同的名称。这可能会产生一些不可预测的结果。
解决方案:更改参数的名称,使它们与列名不同
警告:请注意,我注释掉了两行
问题2
回答问题 #2
你可以使用触发器
Aug 15, 2011
: MySQL 中触发器与存储过程的性能Apr 06, 2012
:如何加快审计触发?问题 #3
对问题 #3 的回答
执行批量操作会使 MySQL 服务器进程变得乏味并陷入困境。这是其他帖子,展示了如何有效地使用 SQL 来替换触发器和存储过程,为什么触发器过多会不好,以及如何尽可能少地编写代码
Aug 11, 2011
:策略 RE 数据库触发器在精心设计的应用程序中?Aug 12, 2011
: MySQL 中触发器与存储过程的性能Dec 23, 2011
:如何在 MySQL 中设置触发器以复制字段结语
存储过程或触发器中的代码越简单,对性能的影响就越小,尤其是对批量 INSERT、UPDATE 和 DELETE 的影响。
请在使用触发器和自动提交行为(如果使用 InnoDB)时考虑存储引擎及其锁定特性(使用 MyISAM)。
错误是您使用未声明的参数名称作为
AccountStatus
值。以下是您的声明
AccountStatus
:但是在您使用的更新和插入语句中
Account_Status
。这是取自您的数据库列值。