MySQL存储过程在某些情况下的意外行为

时间:2020-05-03 11:12:25

标签: mysql sql stored-procedures

我对MySQL存储过程比较陌生。我有一个存储过程在某些条件下可以正常工作,而在其他条件下则不能。我有点困惑导致错误的原因。它是一个处理SP的实体,它基于某些值和条件从暂存表中的数据创建或更新实体。

在正常运行的情况下:

  1. 当我仅处理单个实体时。
  2. entity表中没有任何内容时,用于批量输入。

在以下情况下无效:

  1. entity表中有条目,并且已完成批量处理。 -检查entity_id中已经存在的entity和较旧的entity_id时出错,而应创建一个新的{

(我实际上需要上述方案比其他方案更频繁地工作)

为了理解SP的流程,我尝试将代码保持在最低限度。请考虑所有声明的变量。 SP可能无法编译。

CREATE DEFINER=`admin`@`%` PROCEDURE `sp_ent`(test_id int)
BEGIN
    -- Move code tables to temp tables
    -- Declare all the required variables here
    DECLARE counter, len INT;
    DECLARE var2 INT;
    DECLARE var3 TINYINT(1);
    DECLARE var4 DECIMAL(18,4);
    DECLARE var5 DATE;
    DECLARE var6 VARCHAR(1000);
    DECLARE var7 VARCHAR(5000);

    DROP TEMPORARY TABLE IF EXISTS `temp_ent`;
    IF test_id IS NOT NULL THEN
        CREATE TEMPORARY TABLE IF NOT EXISTS `temp_ent` AS (SELECT * FROM `ent_st` WHERE processed = 0 and id=test_id);
    ELSE
        CREATE TEMPORARY TABLE IF NOT EXISTS `temp_ent` AS (SELECT * FROM `ent_st` WHERE processed = 0);
    END IF;
    ALTER TABLE `temp_ent` ADD PRIMARY KEY(id);
    -- SELECT * FROM `temp_ent`;
    DROP TEMPORARY TABLE IF EXISTS `temp_exc`; CREATE TEMPORARY TABLE IF NOT EXISTS `temp_exc` AS (SELECT * FROM `code_exc`);
    -- A few more like above

    SET counter=1, len=(SELECT COUNT(*) FROM `temp_ent`);
    WHILE counter <= len DO

        SELECT `id`,var1, var2, var3
        INTO v_id,var1, var2, var3
        FROM `temp_ent` LIMIT 1;-- WHERE `id` = v_id;

        BEGIN
        DECLARE insufficient_information CONDITION FOR SQLSTATE '45000';
        DECLARE CONTINUE HANDLER FOR insufficient_information SET v_proccessed=1;

        SET v_status = CASE 
            WHEN ... THEN ...
            ELSE 'valid'
        END;

        IF v_status <> 'valid' THEN SIGNAL insufficient_information; END IF;

        SELECT `entity_id`,`entity` 
        INTO v_underlying_entity_id,v_underlying_entity_symbol
        FROM `entity` WHERE `entity_id` = v_underlying OR `entity` = v_underlying_entity;
        SET v_underlying_entity_symbol = COALESCE(v_underlying_entity_symbol,v_underlying_entity);

        SET v_entity = (
        CASE 
            WHEN ... THEN ...
            WHEN ... THEN ...
            .
            .
            WHEN ... THEN ...
        END
        );

        SELECT `entity_id`,`entity`
        INTO v_entity_id_check,v_entity_check
        FROM entity WHERE `entity`=v_entity and `exc`=v_exc;

        -- SELECT v_entity_id_check,v_entity_check,v_entity,v_exc;
        IF v_entity_check IS NULL THEN
            -- SELECT 'Create New Entity and Add';
            SET v_entity_id = COALESCE((SELECT MAX(`entity_id`) FROM entity),0) + 1;
            SET new_entity = 1;
        ELSE 
            -- SELECT 'Entity Already Present'; 
            SET v_entity_id = v_entity_id_check; 
            SET new_entity = 0;
        END IF;
        -- SELECT v_entity_id, v_entity, new_entity;

        SET v_name = UPPER(COALESCE(v_name,v_entity));
        -- UPDATE entity and underlying/derivatives table
        IF new_entity = 1 THEN

            -- Insert in respective tables
            IF ... THEN
                -- SELECT 'Entity Added',v_entity; -- Underlying Entity
                INSERT INTO `entity_underlying` (`entity_id`,`entity`,`name`,`exc`,`seg`,`ins`,`isin`,`fo_yn`,`tick`,`lot_size`,`active_yn`) 
                VALUES (v_entity_id,v_entity,v_name,v_exc,v_seg,v_ins,COALESCE(v_isin,''),COALESCE(v_fo_yn,0),COALESCE(v_tick,0.05),COALESCE(v_lot_size,1),1); 
            ELSEIF ... THEN
                -- SELECT 'Entity Added',v_entity; -- Derivative Entity
                INSERT INTO `entity_derivatives` (`entity_id`,`entity`,`name`,`underlying`,`exc`,`seg`,`ins`,`ser`,`isin`,`strike`,`tick`,`lot_size`,`expiry`,`ex_ty`,`active_yn`) 
                VALUES (v_entity_id,v_entity,v_name,COALESCE(v_underlying_entity_id,-1),v_exc,v_seg,v_ins,COALESCE(v_ser,''),v_isin,COALESCE(v_strike),COALESCE(v_tick,0.05),COALESCE(v_lot_size,-1),v_expiry,v_ex_ty,1); 
            END IF;
            -- Insert in final table
            INSERT INTO entity(`entity_id`,`entity`,`exc`,`active_yn`) 
            VALUES (v_entity_id,v_entity,v_exc,1);

            SET v_status='Entity Added';
        ELSE
            SET v_status='Not a New Entity';
        END IF;

     END;

        UPDATE `ent_st` SET `entity_id`=v_entity_id,`processed`=1,`status`=v_status WHERE id=v_id;

        DELETE FROM `temp_ent` WHERE id=v_id; 

        SET counter = counter +1;
        COMMIT;
    END WHILE;
END

我们非常感谢您的帮助。预先感谢。

0 个答案:

没有答案