тестирование хранимой процедуры в MySQL Workbench
у меня есть хранимая процедура вставки, где я вставляю в 2 таблицы. Вторая таблица, использующая Last_Insert_ID первой таблицы. Вот мой sproc:
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `new_user_create`(
IN oFarmName varchar(45),
IN oFirstName varchar(45),
IN oAddress1 varchar(45),
IN oCity varchar(45),
IN oState varchar(45),
IN oZip varchar(45),
IN oCountry varchar(45)
)
BEGIN
insert into intelliair.individual
( FarmName, FirstName)
values ( oFarmName, oFirstName);
insert into intelliair.address
(IndividualID, Address1, City, State, Zip, Country)
Values (Last_Insert_ID(), oAddress1, oCity, oState, oZip, oCountry);
END
вот как я тестирую запрос в MySQL workbench:
call new_user_create(@myFarm, @MyName, @MyAddress, @MyCity, @MyState, @MyZip, @MyCountry)
там ошибка, которую я получаю: "столбец Address1 не может быть null"
где я wronng? Это в sproc? Или как я это называю?
3 ответов
"столбец Address1 не может быть null" указывает, что intelliair.address.Address1
поле должно быть определено not null
.
и я не думаю, что вы заранее определенное значение для @MyAddress
перед передачей в хранимую процедуру.
Если он рассматривается как NULL
и, следовательно, возникает ошибка.
для перекрестной проверки значений перед вызовом хранимой процедуры, например:
select @MyAddress; -- ,@myFarm, @MyName, @MyCity, @MyState, @MyZip, @MyCountry;
обновление 1:
вы можете назвать хранимая процедура путем прямого ввода значений для каждого из параметров.
пример:
call new_user_create(
'my Farm value', -- @myFarm
'E B', -- @MyName
'My Address is SO', -- @MyAddress1
'My City is Coders', -- @MyCity
'CA', -- @MyState
'12345', -- @MyZip
'US' -- @MyCountry
);
исключение создается инструкцией INSERT (или UPDATE), которая присваивает нулевое значение столбцу с именем Address1
Это объявлено NOT NULL
.
наиболее вероятным объяснением из того, что вы показываете, является то, что значение, переданное в качестве параметра oAddress1, равно NULL, и исключение создается вторым оператором INSERT.
поэтому наиболее вероятным объяснением является то, что при вызове процедуры @MyAddress
переменные пользователя не присвоено значение.
(вы можете проверить, отсутствует Address1
столбец на intelliair.отдельная таблица или, если она есть, она не определяется как NOT NULL
.)
(существует также возможность, что это не один из ваших операторов, который бросает исключение, а скорее рекурсивный оператор SQL, например, оператор INSERT в before INSERT для каждого триггера строки.)
USE lportal;
DELIMITER $$
CREATE PROCEDURE `iemp`(IN eid INT(11),IN ename varchar(15),IN dname varchar(15),IN doj DATE)
BEGIN
INSERT INTO e_emp (eid,ename,dname,doj) VALUES (eid,ename,dname,doj);
END