10

我有一个插入存储过程,我将在其中插入 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 不能为空”

我哪里错了?它在存储过程中吗?还是我称呼它的方式?

4

3 回答 3

9

Column Address1 cannot be 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
);
于 2012-07-17T15:34:46.613 回答
0

INSERT(或 UPDATE)语句引发了异常,该语句将 NULL 值分配给Address1声明为的名为 的列NOT NULL

从您显示的内容来看,最可能的解释是作为 oAddress1 参数传入的值是 NULL,并且第二个 INSERT 语句引发了异常。

因此,最可能的解释是当调用过程时,@MyAddress用户变量没有被赋值。

(您可以验证Address1intelliair.individual 表上没有列,或者如果有,则未定义为NOT NULL。)

(也有可能不是您的语句引发异常,而是递归 SQL 语句,例如 BEFORE INSERT FOR EACH ROW 触发器中的 INSERT 语句。)

于 2012-07-17T15:34:52.553 回答
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
于 2013-07-16T14:44:38.957 回答