Having Problem with MySQL variables in stored procedure

ghz 9months ago ⋅ 65 views

I have this stored procedure which calculates commissions of a trade Each trade has a buyer and seller and we are calculating commissions for each side. For example 0.15% of commission is deducted as websites share and if trader has been referred by someone to website, then the referrer gets 20% of the websites share. Also referrer can perform a kick-back and restore 10% of his/her share to the trader.

My problem is that sometimes the variables (@buySideReferrerCommission, @buySideUserKickBack) are filled with zero value which they should have higher values. Would be grate if someone could help.

This is the the stored procedure:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
       ROLLBACK;
       RESIGNAL;
    END;

START TRANSACTION;


SET @buySideSiteShare := TRUNCATE(COALESCE((tradeAmount * 0.15) / 100, 0), 12);
SET @buySideUserKickBack := TRUNCATE(COALESCE(@buySideSiteShare * 10 / 100, 0), 12);
SET @buySideReferrerCommission := TRUNCATE(COALESCE(((@buySideSiteShare * 20) / 100) - @buySideUserKickBack, 0), 12);

INSERT INTO commissions (trade_id, site_share, referrer_share, kickback) VALUES (@tradeId,
TRUNCATE(COALESCE(@buySideSiteShare - @buySideReferralerCommission - @buySideUserKickBack, 0), 12), buySideReferrerCommission, buySideUserKickBack);


COMMIT;

Answers

It seems like you have a few potential issues in your stored procedure that may be causing the variables @buySideReferrerCommission and @buySideUserKickBack to be filled with zero values unexpectedly. Let's review and address each potential issue:

  1. Error Handling: You have defined an exit handler for SQL exceptions, which is a good practice. However, if an exception occurs, you are rolling back the transaction and then re-signaling the exception. This means that the transaction will always be rolled back, and the error will be re-raised. Make sure that you handle exceptions appropriately and investigate any errors that occur.

  2. Data Type Compatibility: Ensure that the data types of the variables and expressions are compatible. If any of the operands in an expression are of a different data type, the result may not be as expected. For example, if tradeAmount is not of a numeric data type, the expression (tradeAmount * 0.15) / 100 may produce unexpected results.

  3. Null Handling: You are using COALESCE to handle potential NULL values in your expressions. Make sure that the columns involved in the calculations do not contain NULL values, or handle NULL values appropriately in your expressions.

  4. Mathematical Precision: Ensure that you are performing mathematical operations with the desired precision. The TRUNCATE function is used to truncate a number to a specified number of decimal places. Make sure that the precision specified in the TRUNCATE function is appropriate for your calculations.

  5. Variable Names: There seems to be a typo in your INSERT statement. You are using variable names like @buySideReferralerCommission which should be @buySideReferrerCommission.

Here's a revised version of your stored procedure with some potential improvements:

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    ROLLBACK;
    RESIGNAL;
END;

START TRANSACTION;

-- Calculate commissions
SET @buySideSiteShare := TRUNCATE((tradeAmount * 0.15) / 100, 12);
SET @buySideUserKickBack := TRUNCATE(@buySideSiteShare * 10 / 100, 12);
SET @buySideReferrerCommission := TRUNCATE((@buySideSiteShare * 20) / 100 - @buySideUserKickBack, 12);

-- Insert commission record
INSERT INTO commissions (trade_id, site_share, referrer_share, kickback) 
VALUES (@tradeId, 
        TRUNCATE(@buySideSiteShare - @buySideReferrerCommission - @buySideUserKickBack, 12), 
        @buySideReferrerCommission, 
        @buySideUserKickBack);

COMMIT;

Make sure to review each part of your stored procedure, verify the data types and values involved, and handle exceptions and errors appropriately. If you continue to encounter issues, consider adding debug statements or logging to trace the values of the variables and identify where the problem occurs.