MySQL:如何从另一个存储过程执行存储过程?

时间:2019-07-09 10:05:48

标签: mysql sql stored-procedures

我有一个Mysql存储过程,
我正在尝试从第一个存储过程调用另一个存储过程,
但是在执行操作时出现以下错误-

Error Code: 1242. Subquery returns more than 1 row

1。以下是第一个存储过程-

CREATE DEFINER=`root`@`localhost` PROCEDURE `process_snapshot`()
BEGIN
    DECLARE snaptime INT;
    DECLARE snapshot_year INT;
    DECLARE partition_name VARCHAR(17);
    DECLARE isPartionPresent varchar(64);
    DECLARE addPartition VARCHAR(100);

    SET snaptime := UNIX_TIMESTAMP(CONCAT(DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'),INTERVAL 1 DAY),' 23:59:59'));
    SET snapshot_year := DATE_FORMAT(NOW(),'%Y');
    SET partition_name := CONCAT('snapshot_',snapshot_year);

    SET isPartionPresent := (SELECT PARTITION_NAME
        FROM
            INFORMATION_SCHEMA.PARTITIONS
        WHERE
            TABLE_NAME = 'snapshot'
            AND PARTITION_NAME = partition_name);

    IF @isPartionPresent IS NOT NULL THEN
        CALL snapshot;
    ELSE
        SET @addPartition = CONCAT('ALTER TABLE wor_snapshot ADD PARTITION (PARTITION ', partition_name, ' VALUES IN (', snapshot_year,'))');
        PREPARE _stmt FROM @addPartition;
        EXECUTE _stmt;
        DEALLOCATE PREPARE _stmt;

        CALL snapshot;
    END IF;

END

2。以下是第二个存储过程-
存储过程快照正在使用select语句插入数据。

    CREATE DEFINER=`root`@`localhost` PROCEDURE `snapshot`()
    BEGIN
        DECLARE snaptime INT;
        SET snaptime := UNIX_TIMESTAMP(CONCAT(DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'),INTERVAL 1 DAY),' 23:59:59'));

    INSERT into snapshot 
(user_id, latest_transaction_id, balance, last_transaction_timestamp, last_transaction_date, snapshot_date, year)
    SELECT 
        T2.user_id,
        T2.transaction_id AS latest_transaction_id,
        T2.new_balance AS balance,
        T2.created_date AS last_transaction_timestamp,
        DATE_FORMAT(FROM_UNIXTIME(T2.created_date),
                '%Y-%m-%d %I:%i:%S') AS last_transaction_date,
        DATE_FORMAT(NOW(), '%Y-%m-%d') AS snapshot_date,
        DATE_FORMAT(NOW(), '%Y') AS year
    FROM
        (SELECT 
            user_id, MAX(transaction_id) maxTransID
        FROM
            transaction
        WHERE
            created_date < snaptime
        GROUP BY user_id) Tmp
            JOIN
        transaction T2 ON Tmp.MaxTransID = T2.Transaction_ID;
    END

我尝试将第二个存储过程转换为函数,
但是在那种情况下,我无法在函数中获得snaptime

0 个答案:

没有答案