2011-03-12 54 views
0

我创建了一个存储过程:错误在存储过程 - 列计数不匹配值

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `zero`.`sp_for_insert_into_account_db`$$ 
CREATE PROCEDURE `zero`.`sp_for_insert_into_account_db` (usr_key char(6),usr_name varchar(15),usr_password varchar(15),OUT output_message INT) 

BEGIN 

DECLARE no_of_row INT;  
SELECT COUNT(*) INTO no_of_row from account_db; 
IF no_of_row < 4 THEN 

    SET @s = CONCAT('insert into account_db (USR_KEY,USR_NAME,USR_PWD) VALUES (',usr_key,usr_name,usr_password,')'); 

    PREPARE stmt FROM @s; 
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
    SET output_message=1;  
ELSE  
    SET output_message=0;  
END IF; 
END$$ 

DELIMITER ; 

我与查询调用它

call sp_for_insert_into_account_db('a','b','c',@output_ message); 

的错误是这样的:

列数不匹配值...

我传递4个参数...

为什么会发生此错误?

我已经用这种语法检查(缺省参数类型)

sp_for_insert_into_account_db(IN usr_key char(6), 
           IN usr_name varchar(15), 
           IN usr_password varchar(15), 
           OUT output_message INT) 
+0

错误的确切用词在这里也很有用。 – cwallenpoole 2011-03-12 15:02:25

回答

1

问题也正在于此:

SET @s = CONCAT('insert into account_db (USR_KEY,USR_NAME,USR_PWD) VALUES (',usr_key,usr_name,usr_password,')'); 

您正在试图插入3个值以及级联回报1

用这个代替:

SET @s = CONCAT('insert into account_db (USR_KEY,USR_NAME,USR_PWD) VALUES (\'',usr_key,'\',\'',usr_name,'\',\'',usr_password,'\')'); 
1

不完全确定为什么当你不需要时使用预处理语句/动态sql?请看下面的例子我已经清理了你一点:

drop procedure if exists sp_for_insert_into_account_db; 

delimiter # 

create procedure sp_for_insert_into_account_db 
(
in p_usr_key char(6), 
in p_usr_name varchar(15), 
in p_usr_pwd varchar(15), 
out p_output_message tinyint unsigned 
) 
begin 

declare v_no_of_row int unsigned default 0; 

set p_output_message=0; 

select count(*) into v_no_of_row from account_db; 

if v_no_of_row < 4 then 
    insert into account_db(usr_key, usr_name, usr_pwd) values (p_usr_key, p_usr_name, p_usr_pwd); 
    set p_output_message = 1; 
end if; 

end# 

delimiter ; 

call sp_for_insert_into_account_db (...); 

编辑

你是一个COBOL程序从1970和这就是为什么你必须使用CAPS?

+0

非常感谢你先生...................真的很感谢,我的代码开始工作还是很混乱,系统如何区分哪些是可变的,系统如何理解,我们只需要通过in参数替换p_usr_key,而忽略usr_key ... – Arjun 2011-03-14 05:24:14

+0

变量在sproc的主体中声明,我通常在v_(变量)前加上前缀。参数在sproc接口中声明,我通常以p_(param)为前缀,这可以避免params/vars与表中的字段具有相同名称时的混淆 – 2011-03-14 07:45:49

相关问题