1

ビューからエントリを読み取り、さまざまな条件に応じて別のテーブルに行を挿入する MySQL のプロシージャを作成しています。このコンテキストではsize_id、 と という名前の最大 4 つの可能な変数がmy_size_1, my_size_2, my_size_3ありmy_size_4ます。値がない場合、それらはNULLです。ストアド プロシージャに次の式を記述すると、SQL エラーが発生します。

-- Insert recommendation options --
INSERT INTO `size_recommendation_options`
VALUES (my_size_recommendation_id, my_size_1);

IF my_size_2 IS NOT NULL THEN
    INSERT INTO `size_recommendation_options`
    VALUES (my_size_recommendation_id, my_size_2);
END;

IF my_size_3 IS NOT NULL THEN
    INSERT INTO `size_recommendation_options`
    VALUES (my_size_recommendation_id, my_size_3);
END;

IF my_size_4 IS NOT NULL THEN
    INSERT INTO `size_recommendation_options`
    VALUES (my_size_recommendation_id, my_size_4);
END;

...ただし、IFステートメントを削除するとエラーが修正されます。つまり、以下は問題なく実行されます。

-- Insert recommendation options --
INSERT INTO `size_recommendation_options`
VALUES (my_size_recommendation_id, my_size_1);

INSERT INTO `size_recommendation_options`
VALUES (my_size_recommendation_id, my_size_2);

INSERT INTO `size_recommendation_options`
VALUES (my_size_recommendation_id, my_size_3);

INSERT INTO `size_recommendation_options`
VALUES (my_size_recommendation_id, my_size_4);

何故ですか?これは世界の終わりではありません -DELETE FROM size_recommendation_options WHERE size_id IS NULL後で追加することはできますが、不要な挿入はすべてストアド プロシージャの速度を大幅に低下させます。最初のブロックが無効な SQL である理由は?

ありがとう。

4

2 に答える 2

1

IFブロックは次のように閉じる必要がありますEND IF:

http://dev.mysql.com/doc/refman/5.6/en/if-statement.html

13.6.5.2. IF Syntax

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

あなたの場合:

IF my_size_2 IS NOT NULL THEN
    INSERT INTO `size_recommendation_options`
    VALUES (my_size_recommendation_id, my_size_2);
END IF;
于 2012-07-13T17:33:22.250 に答える
0

次のような Store プロシージャを試しましたか?

CREATE PROCEDURE insert_val
     (
        IN  a_id                    INT(11)       , 
        IN  a_first                     VARCHAR(15)       
     )
BEGIN 
if 
    INSERT INTO t1(actor_id, first_name )
    VALUES (a_id, a_first) ; 
END 

mysql> call insert_val(10,'a');
Query OK, 1 row affected, 0 warning (0.00 sec)

mysql> call insert_val(null,'a');
ERROR 1048 (23000): Column 'actor_id' cannot be null

入力値を null にすることはできないため、null の挿入について心配する必要はありません。

于 2012-06-27T20:23:27.897 に答える