0

Mysql 游标只获取第一行,当它获取第二行时,row_not_found 变量设置为 false 并且游标关闭。请查看以下SP:

CREATE DEFINER = 'root'@'localhost'
PROCEDURE billingv2test.SP_CreateRecurringBillingOrders(IN _billingDate DATETIME,
IN _defaultBillingFrequency INT,
IN _IsForcedExecution BIT)
BEGIN
    DECLARE _userId char(36);
    DECLARE _billingStartDate datetime;
    DECLARE _billingEndDate datetime;
    DECLARE _cmd VARCHAR(4000);
    DECLARE _userBillingHistoryId char(36);
    DECLARE _paymentOrderId char(36);
    DECLARE _orderNumber VARCHAR(100);
    DECLARE _totalChargeAmount DECIMAL(15, 6);
    DECLARE _couponChargeAmount DECIMAL(15, 6);
    DECLARE _pendingChargeAmount DECIMAL(15, 6);
    DECLARE _isError BIT;
    DECLARE _noOfUsersProcessed BIT;
    DECLARE _billingResourceType VARCHAR(20);  
    DECLARE _RowNo INT;
    DECLARE _defaultDateTime DATETIME;
    DECLARE record_not_found INTEGER DEFAULT 0;
    DECLARE user_list varchar(200);

    DECLARE ProcessUsersForRecurringBilling_Cursor CURSOR FOR 
    SELECT OwnerId FROM UserBillingInfo
    WHERE NextBillingDate IS NOT NULL
        AND cast(NextBillingDate as date) <= cast( _billingDate as date)
        AND IsProcessPending = 0
        AND IsDeleted = 0
        AND BillingStatus <> 'Delinquent'
    ORDER BY NextBillingDate;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET record_not_found = 1;

    SET _isError = 0;
    SET _noOfUsersProcessed = 0;
    SET _defaultDateTime = '1900-01-01 00:00:00';
    SET _userBillingHistoryId = UUID();

    INSERT INTO BillingHistory( Id, BillingStartTime, BillingEndTime, Status, NoOfUsersProcessed, CreateTime, UpdateTime )
    VALUES  ( _userBillingHistoryId, UTC_TIMESTAMP(), NULL , 'Started', 0, UTC_TIMESTAMP(), UTC_TIMESTAMP());


    OPEN ProcessUsersForRecurringBilling_Cursor;
    allusers: LOOP
    FETCH ProcessUsersForRecurringBilling_Cursor INTO _userId;
    IF record_not_found THEN 
    LEAVE allusers;  
    END IF;
        SET user_list = CONCAT(IFNULL(user_list,''),", ",_userId);
        SET _isError = 0;
        SET _orderNumber = '';
        SET _totalChargeAmount = '0';
        SET _couponChargeAmount = '0';
        SET _pendingChargeAmount = '0';
        UPDATE UserBillingInfo SET IsProcessPending = 1 WHERE OwnerId = _userId;
        SET _billingStartDate = _defaultDateTime;

        SELECT
             IFNULL(InvoiceDate, _defaultDateTime) INTO _billingStartDate 
        FROM
            PaymentOrder
        WHERE OwnerId = _userId AND OrderStatus IN ('Success', 'Submitted')
        ORDER BY CreateTime DESC
        LIMIT 1;

    SELECT NextBillingDate INTO _billingEndDate FROM UserBillingInfo WHERE OwnerId = _userId;

    SET _orderNumber = UUID();
    SET _orderNumber = SUBSTRING(_orderNumber, 0, LOCATE('-', _orderNumber));

    -- CALL SP_CreateRecurringBillingPaymentOrder
    CALL SP_CreateRecurringBillingPaymentOrder
    (_userId, _billingStartDate, _billingEndDate, _orderNumber, _userBillingHistoryId, _paymentOrderId);

    SELECT  Amount INTO _totalChargeAmount FROM PaymentOrder WHERE Id = _paymentOrderId;     
    SET _pendingChargeAmount = _totalChargeAmount;

    UPDATE PaymentOrder set ChargeAmount = _pendingChargeAmount, UpdateTime = UTC_TIMESTAMP()
        WHERE Id = _paymentOrderId;

    UPDATE ResourceUsageProcessed SET BillingStatus = 'Completed'
        WHERE PaymentOrderId = _paymentOrderId AND BillingStatus = 'Processing';

        SET _noOfUsersProcessed = _noOfUsersProcessed + 1;

    END LOOP allusers;
    CLOSE ProcessUsersForRecurringBilling_Cursor;

  UPDATE BillingHistory SET NoOfUsersProcessed = _noOfUsersProcessed, Status = 'Completed', BillingEndTime = UTC_TIMESTAMP()
    WHERE Id = _userBillingHistoryId;

END
4

1 回答 1

0

嘿,这听起来可能很傻,但试试这个

IF record_not_found=1 THEN LEAVE allusers;

于 2013-07-02T12:08:49.207 回答