1

HeidiSQL で次の行でエラー 1064が表示される次のストアド プロシージャを作成しました。SET pay_ref = SELECT CONCAT('KOS' ...

まず、この手順で何が起こっているのかを説明しましょう。gamersauto_increment を持つ BIGINT 主キーを持つテーブルがあります。このプロシージャは次のことを想定しています。

  1. ユーザーからいくつかのパラメーターを受け取ります
  2. ユーザーの電子メール アドレスに基づいてデータベースにユーザーが既に存在するかどうかを確認し、レコードが存在する場合は「DUPLICATE」という単語を吐き出します。
  3. それ以外の場合は、通常どおり挿入を行います
  4. 次に、作成された新しいレコードの ID を読み取り、それを varchar に変換し、先頭にゼロを埋め込んでから、他の文字列と連結します。
  5. この新しい文字列 (たとえばKOS00001ABCDEF) がフィールドに更新されpay_refcodeます >>> これが、ユーザーの一意の支払い参照を生成することに決めた方法です
  6. すべてがうまくいけばretval、新しく生成された参照コードで更新され、PHP スクリプトによって読み取られます。

DELIMITER //
CREATE PROCEDURE `InsertGamer` (
    IN p_fname          VARCHAR(30),
    IN p_lname          VARCHAR(30),
    IN p_email          VARCHAR(255),
    IN p_favgame        VARCHAR(60),
    IN p_pay_suffix     VARCHAR(6),
    OUT retval          VARCHAR(14)
)
BEGIN
    DECLARE last_id BIGINT;
    DECLARE pay_ref VARCHAR(14);

    IF (EXISTS(SELECT * FROM gamers WHERE (email = p_email))) THEN
        SET retval = 'DUPLICATE';
    ELSE
        INSERT INTO gamers (fname, lname, email, favgame, pay_refcode)
        VALUES (p_fname, p_lname, p_email, p_favgame, NULL);
        SET last_id = LAST_INSERT_ID();
        SET pay_ref = SELECT CONCAT('KOS', (SELECT LPAD(CONVERT(last_id, VARCHAR(5)),5,'0')), p_pay_suffix);

        UPDATE gamers
        SET pay_refcode = pay_ref
        WHERE application_id = last_id;

        SET retval = pay_ref;           
    END IF;
END //

私は一生、問題が何であるかを理解することはできません。あなたからの助けに心から感謝します. 事前にどうもありがとうございました!

4

1 に答える 1

1

SELECT値を設定した行からキーワードを削除するだけですpay_ref

SET pay_ref = CONCAT('KOS', LPAD(CONVERT(last_id, CHAR(5)),5,'0'), p_pay_suffix);

完全なコード:

DELIMITER //
CREATE PROCEDURE `InsertGamer` (
    IN p_fname          VARCHAR(30),
    IN p_lname          VARCHAR(30),
    IN p_email          VARCHAR(255),
    IN p_favgame        VARCHAR(60),
    IN p_pay_suffix     VARCHAR(6),
    OUT retval          VARCHAR(14)
)
BEGIN
    DECLARE last_id BIGINT;
    DECLARE pay_ref VARCHAR(14);

    SET @count := (SELECT COUNT(*) FROM gamers WHERE email = p_email)
    IF (@count > 0) THEN
        SET retval = 'DUPLICATE';
    ELSE
        INSERT INTO gamers (fname, lname, email, favgame, pay_refcode)
        VALUES (p_fname, p_lname, p_email, p_favgame, NULL);

        SET last_id = LAST_INSERT_ID();

        SET pay_ref = CONCAT('KOS', LPAD(CONVERT(last_id, CHAR(5)),5,'0'), p_pay_suffix);

        UPDATE gamers
        SET pay_refcode = pay_ref
        WHERE application_id = last_id;

        SET retval = pay_ref;           
    END IF;
END //
DELIMITER ;
于 2013-03-01T01:21:53.517 に答える