Ошибка в хранимой процедуре - количество столбцов не соответствует значению - PullRequest
0 голосов
/ 12 марта 2011

Я создал хранимую процедуру:

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 аргумента ...

Почему происходит эта ошибка?

Я уже проверял этот синтаксис (по умолчанию параметр имеет тип IN)

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)

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Не совсем уверен, почему вы используете подготовленные операторы / динамические 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 (...);

EDIT

Являетесь ли вы программистом COBOL 1970-х годов и хотите ли вы использовать колпачки?

1 голос
/ 12 марта 2011

Проблема также здесь:

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,'\')');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...