在MySql Workbench中测试存储过程

时间:2012-07-17 15:26:34

标签: mysql testing stored-procedures insert mysql-workbench

我有一个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中吗?或者我称呼它的方式?

3 个答案:

答案 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