10

2 つのテーブルに挿入する挿入ストアド プロシージャがあります。最初のテーブルの Last_Insert_ID を使用する 2 番目のテーブル。これが私の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 ワークベンチでクエリをテストする方法は次のとおりです。

call new_user_create(@myFarm, @MyName, @MyAddress, @MyCity, @MyState, @MyZip, @MyCountry)

私が得るエラーがあります:「列Address1はnullにすることはできません」

どこが間違っているのですか?それはsprocにありますか?それとも私がそれを呼んでいる方法ですか?

4

3 に答える 3

9

列アドレス1を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) ステートメントによってスローされています。Address1つまり、 と宣言されている という名前の列に NULL 値を代入していますNOT NULL

あなたが示していることから、最も可能性の高い説明は、oAddress1 パラメーターとして渡された値が NULL であり、2 番目の INSERT ステートメントによって例外がスローされているということです。

したがって、最も可能性の高い説明は、プロシージャへの呼び出しが行われたときに、@MyAddressユーザー変数に値が割り当てられていないということです。

( Address1intelliair.individual テーブルに列がないこと、または列がある場合は として定義されていないことを確認できNOT NULLます。)

(例外をスローしているのはステートメントの 1 つではなく、BEFORE INSERT FOR EACH ROW トリガーの INSERT ステートメントのような再帰 SQL ステートメントである可能性もあります。)

于 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 に答える