1

別のメインテーブルに挿入された最後のIDに基づいてテーブルを作成する必要があります。このために、次のストアドプロシージャを作成しました。

CREATE PROCEDURE `sp_create_campaign`
(
        IN  p_vName         VARCHAR(70),
        IN  p_iIdOper       INT(11),
        IN  p_iIdCount      INT(11),
        IN  p_iIdMoney      INT(11),
        IN  p_cPrefix       CHAR(2),
        IN  p_tComment      TINYTEXT,
        IN  p_iIdUser       VARCHAR(32),
        OUT p_return_code   TINYINT UNSIGNED
)
BEGIN

    DECLARE p_campaign INT(11);

    DECLARE exit handler for sqlexception
    BEGIN
        -- ERROR
            set p_return_code = 1;
            rollback;
    END;

    DECLARE exit handler for sqlwarning
    BEGIN
            -- WARNING
            set p_return_code = 2;
            rollback;
    END;

    START TRANSACTION;

        -- Campaign
        INSERT INTO `db_campaign` 
            (`vName`, `iIdOper`, `iIdCount`, `iIdMoney`, `cPrefix`, `tComment`, `iIdUser`, `dRegister`)
            VALUES
            (p_vName, p_iIdOper, p_iIdCount, p_iIdMoney, p_cPrefix, p_tComment, p_iIdUser, NOW());

        SET p_campaign := LAST_INSERT_ID();

        -- Sales
        SET @s = CONCAT('DROP TABLE IF EXISTS ', 'db_sale_', p_campaign);
        PREPARE stm FROM @s;
        EXECUTE stm;

        SET @x = CONCAT(
                'CREATE TABLE ',
                'db_sale_', p_campaign,
                "(
                `iIdSale`           INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
                `dDate`             DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
                `dSubtotal`         DECIMAL(7,2) UNSIGNED NOT NULL DEFAULT '00.00',
                `dTax`              DECIMAL(7,2) UNSIGNED NOT NULL DEFAULT '00.00',
                `dTotal`            DECIMAL(7,2) UNSIGNED NOT NULL DEFAULT '00.00',
                `iIdMoney`          INT(11) UNSIGNED NOT NULL,
                `iIdOper`           INT(11) UNSIGNED NOT NULL,
                `iIdBankCount`      INT(11) UNSIGNED NOT NULL,
                `iIdGroup`          INT(11) UNSIGNED NOT NULL,
                `iIdUser`           INT(11) UNSIGNED NOT NULL,
                `iIdUserReg`        VARCHAR(32) NOT NULL,
                `dRegister`         DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
                PRIMARY KEY (`iIdSale`)
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8;");        

        PREPARE stm FROM @x;
        EXECUTE stm;

    COMMIT;

    -- SUCCESS
    set p_return_code = 0;

END

ただし、問題は、最初のレコードのみを挿入し、テーブルの作成に失敗することです。私はどこで失敗していますか?

4

4 に答える 4

4

次の行を置き換えます。SET p_campaign := LAST_INSERT_ID();

これで:SELECT LAST_INSERT_ID() INTO p_campaign ;

于 2015-04-10T10:56:11.163 に答える
0

使用する場合は、代わりにSET必要です=:=

于 2012-07-19T15:33:34.590 に答える
0

2つのこと:

  1. 実行DROPすると、暗黙的COMMITにトランザクションが実行されます。

  2. 追加してみる

    DEALLOCATE PREPARE stm;

EXECUTEステートメントの後。

于 2012-07-19T15:36:41.357 に答える
0

last_insert_id()のMySQLドキュメントによると

ストアド プロシージャが LAST_INSERT_ID() の値を変更するステートメントを実行する場合、変更された値は、プロシージャ コールに続くステートメントで認識されます。

次のようなものを使用します。

SELECT id INTO p_campaign FROM db_campaign ORDER BY id DESC LIMIT 1;

または:

SELECT max(id) INTO p_campaign FROM db_campaign;

于 2018-06-18T13:55:26.033 に答える