1

autos列を持つテーブルがあります。テーブルnameの最初の 5 行をチェックし、name値がの場合"toyota"、テーブルmytableに「はい」と書き、それ以外の場合は「いいえ」と書きます。私はストアドプロシージャを書いていmysqli_error()ますが、私が持っている行でエラーを返しますEXECUTE ...

ではなく、クエリを直接WHEN記述した場合、手順は機能します。PREPARED STATEMENT私のコードを見て、どこが間違っているのか教えてください。

CREATE PROCEDURE proc_auto()
BEGIN

DECLARE start INT;
SET start = 0;
PREPARE stmt FROM  ' SELECT name FROM autos ORDER BY id LIMIT ?,1 ';

WHILE start < 5 DO

    CASE 
        WHEN (EXECUTE stmt USING @start ) = 'toyota'
            THEN INSERT INTO mytable (log)  VALUES('yes');
        ELSE 
           INSERT INTO mytable (log)  VALUES('no');
    END CASE;
    SET start = start + 1;

END WHILE;
END;
4

2 に答える 2

2

(に関する提案EXECUTEは、正しくなく、混乱を招く可能性があるため削除されました。)

ストアド プロシージャを使用して解決しようとしている問題は、実際にはストアド プロシージャを使用しなくても、まったく異なるアプローチを使用して解決できます。INSERT ... SELECT代わりに 1 つのステートメントを使用するだけです。

INSERT INTO mytable (log)
SELECT
  CASE name
    WHEN 'toyota' THEN 'yes'
    ELSE 'no'
  END
FROM autos
ORDER BY id
LIMIT 5

つまり、上記のステートメントはストアド プロシージャと同じことを行います。最初の 5 行を から取得し、5 行をautosに挿入しmytableます。の値に応じて、es またはsnameが生成されます。yesno

于 2012-07-07T20:47:52.650 に答える
2

Andriy M のINSERTステートメントは最も洗練されたソリューションですが、それでもプロシージャを使用したい場合は、これでうまくいきます。

CREATE PROCEDURE proc_auto()
BEGIN
    DECLARE start INT DEFAULT 0;

    PREPARE stmt FROM 
        'SELECT name INTO @name FROM autos ORDER BY id LIMIT ?,1';

    WHILE start < 5 DO
        SET @start = start;
        EXECUTE stmt USING @start;
        IF @name = 'toyota' THEN
            INSERT INTO mytable (log)  VALUES('yes');
        ELSE 
            INSERT INTO mytable (log)  VALUES('no');
        END IF;
        SET start = start + 1;
    END WHILE;
END;

ただし、この場合、 a を使用するCURSORとパフォーマンスが向上します。

CREATE PROCEDURE proc_auto()
BEGIN
    DECLARE start INT DEFAULT 0;
    DECLARE b_not_found BOOL DEFAULT FALSE;

    DECLARE cur CURSOR FOR
        'SELECT name FROM autos ORDER BY id LIMIT 5';

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b_not_found = TRUE;

    OPEN cur;

    loop1: WHILE start < 5 DO
        FETCH cur INTO @name;
        IF b_not_found THEN
            LEAVE loop1;
        END IF;

        IF @name = 'toyota' THEN
            INSERT INTO mytable (log)  VALUES('yes');
        ELSE 
            INSERT INTO mytable (log)  VALUES('no');
        END IF;
        SET start = start + 1;
    END WHILE;

    CLOSE cur;
END;
于 2012-10-18T17:35:21.043 に答える