我有一个Insert存储过程,我将其插入到2个表中。第二个表使用第一个表的Last_Insert_ID。这是我的特色:
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工作台中测试查询的方法:
call new_user_create(@myFarm, @MyName, @MyAddress, @MyCity, @MyState, @MyZip, @MyCountry)
我得到的错误是:“列地址1不能为空”
我要去哪里?它在sproc中吗?或者我称呼它的方式?
答案 0 :(得分:8)
“列地址1不能为空”表示必须定义intelliair.address.Address1
字段not null
。
并且,在将@MyAddress
传递给存储过程之前,我认为您没有为NULL
预定义值
除非已定义,否则将其视为select @MyAddress; -- ,@myFarm, @MyName, @MyCity, @MyState, @MyZip, @MyCountry;
,因此会抛出错误。
在调用存储过程之前交叉检查值,如:
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
);
更新1 :
您可以通过直接输入每个参数的值来调用存储过程 示例:
{{1}}
答案 1 :(得分:0)
INSERT(或UPDATE)语句抛出异常,即将NULL值分配给声明为Address1
的名为NOT NULL
的列。
根据您的显示,最可能的解释是,作为oAddress1参数传入的值为NULL,并且第二个INSERT语句抛出异常。
因此,最可能的解释是,当对程序进行调用时,@MyAddress
用户变量未分配值。
(您可以验证intelliair.individual表中没有Address1
列,或者如果有,则不会将其定义为NOT NULL
。)
(也有可能不是你的一个语句抛出了异常,而是一个递归的SQL语句,就像BEFORE INSERT FOR EACH ROW触发器中的INSERT语句一样。)
答案 2 :(得分:0)
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