Description:
I have faced a issue when I create a procedure in MySQL it works well.
after some days procedure not working as expected.
How to repeat:
just create procedure :
CREATE PROCEDURE `test_procedure`(IN _ID int)
sp_Exit: BEGIN
DECLARE MaxB2CPID int;
DECLARE _debacctNumber VARCHAR(30);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SHOW ERRORS;
ROLLBACK;
CALL sp_test_update();
RESIGNAL;
END;
DROP temporary table IF EXISTS `tblRemittanceCount`;
DROP temporary table IF EXISTS `tblAdjustmentCount`;
SET SQL_SAFE_UPDATES = 0;
INSERT INTO test (ServiceName, ClassName, MethodName, SP_Name, DataString, ErrorMessage, ErrorStackTrace, ErrorDataTime)
values('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'Procedure log..Line 20', '', NOW());
IF EXISTS(SELECT PID FROM Ps WHERE FileID = _ID Limit 1)
THEN
call `usp_LogError`('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'SP Exit - Ps', '');
LEAVE sp_Exit;
END IF;
IF EXISTS(SELECT PR.PID FROM Premittances PR
INNER JOIN Ps P
ON (P.PID = PR.PID AND P.ClientID = PR.ClientID) WHERE P.FileID = _ID LIMIT 1)
THEN
call `usp_LogError`('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'SP Exit - Premittances', '');
LEAVE sp_Exit;
END IF;
IF EXISTS(SELECT PR.AdjustmentID FROM Premittanceadjustments PR
INNER JOIN Ps P
ON (P.PID = PR.PID AND P.ClientID = PR.ClientID) WHERE P.FileID = _ID LIMIT 1)
THEN
call `usp_LogError`('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'SP Exit - Premittanceadjustments', '');
LEAVE sp_Exit;
END IF;
IF EXISTS(SELECT PD.PID FROM Pdeductions PD
INNER JOIN Ps P
ON (P.PID = PD.PID AND P.ClientID = PD.ClientID) WHERE P.FileID = _ID LIMIT 1)
THEN
call `usp_LogError`('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'SP Exit - Pdeductions', '');
LEAVE sp_Exit;
END IF;
IF EXISTS(SELECT GS.FileID FROM gsdata GS
INNER JOIN file P
ON GS.fileID = P.FileID WHERE P.FileID = _ID LIMIT 1)
THEN
call `usp_LogError`('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'SP Exit - gsdata', '');
LEAVE sp_Exit;
END IF;
IF EXISTS(SELECT PTN.PID FROM Ptransnumbers PTN
INNER JOIN Ps P
ON (P.PID = PTN.PID AND P.ClientID = PTN.ClientID) WHERE P.FileID = _ID LIMIT 1)
THEN
call `usp_LogError`('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'SP Exit - Ptransnumbers', '');
LEAVE sp_Exit;
END IF;
START trans;
CALL sp_test_update(_ID, 62, 0, 'cd', 1, 0, 0);
SELECT P.ClientID, P.ProcessingFlags, P.FileName, P.FileType, ifnull(CGPC.CustomFileTypeID, 0)
INTO @ClientID, @ProcessingFlags, @FileName, @PFileType, @CustomFileTypeID
FROM file P
INNER JOIN client_db.client_generalprofileconfiguration CGPC ON P.ClientID = CGPC.ClientID
WHERE FileID = _ID;
SELECT IFNULL(MAX(PID), 0)
INTO @MaxPID
FROM Ps
WHERE ClientID = @ClientID;
SELECT COUNT(FileID)
INTO @TempPCount
FROM temp_Ps
WHERE FileID = _ID;
SELECT COUNT(FileID)
INTO @TempPRemmittanceCount
FROM temp_Premittances
WHERE FileID = _ID;
SELECT COUNT(FileID)
INTO @TempPAdjustmentsCount
FROM temp_Premittanceadjustments
WHERE FileID = _ID;
SELECT COUNT(FileID)
INTO @TempPDeductionsCount
FROM temp_Pdeductions
WHERE FileID = _ID;
SELECT COUNT(FileID)
INTO @TempGsDataCount
FROM temp_gsdata
WHERE FileID = _ID;
SELECT COUNT(FileID)
INTO @TempPtransNumbersCount
FROM temp_Ptransnumbers
WHERE FileID = _ID;
INSERT INTO Ps (
ClientID,
PID,
CreatedAt,
FileID,
StatusID,
debacctNumber,
PayeeName,
PIdentifier,
RemitTo,
Amount,
ValueDateRequested,
ExceptionFlags,
Notes,
RequestedPTypeID,
RemittanceDeliveryStatusID,
transControlNumber,
ReturnStatusID
,GroupControlNumber
,CurrencyCode
,CardAccountNumber
,IndexNo
,BufferIndex
,PayerCompanyName
,TypeID
,CheckAddress
,TraceNumber
,FormID
,CheckNumber
,AmountRequested
,CHKAddress1
,CHKAddress2
,CHKCityName
,CHKStateProvince
,CHKZipCode
,CHKCountryISO
)
SELECT
@ClientID,
@MaxPID + BP.PSeqNum,
NOW(),
_ID,
0,
UDF_encrypt(BP.debacctNumber),
BP.PayeeName,
BP.PIdentifier,
IFNULL(REPLACE(BP.RemitTo,'&','&'),''),
BP.Amount,
BP.ValueDateRequested,
0,
LEFT(BP.Notes,1000),
PS.PTypeID,
1,
BP.transControlNumber,
1
,GroupControlNumber
,CASE WHEN BP.PType in ('CHK','CDM') THEN ifnull(nullif(BP.CurrencyCode,''),'USD') ELSE NULL END
,UDF_encrypt(BP.debacctNumber)
,IndexNo
,BufferIndex
,PayerCompanyName
,CASE WHEN PS.PTypeID IN (8,32) THEN NULL ELSE PS.PTypeID END
,CheckAddress
,BP.TraceNumber
,BP.FormID
,BP.CheckNumber
,BP.Amount
,BP.CHKAddress1
,BP.CHKAddress2
,BP.CHKCityName
,BP.CHKStateProvince
,BP.CHKZipCode
,BP.CHKCountryISO
FROM temp_Ps BP
LEFT JOIN lkp_Ptypes PS
ON (BP.PType = PS.PCode AND PS.LocaleID = 1)
WHERE BP.FileID = _ID;
SELECT COUNT(PID)
INTO @PCount
FROM Ps
WHERE FileID = _ID;
IF (@PCount > 0)
THEN
INSERT INTO Premittances(
ClientID,
PID,
RemittanceID,
PRDocType,
PRDocNumber ,
PRDocDate,
PRDocRef ,
PEDocType,
PEDocNumber,
PEDocDate,
Amount,
AmountPaid,
AmountOfDiscount,
AdjustmentReasonCode,
AdjustmentAmount,
Notes )
SELECT @ClientID,
@MaxPID + PSeqNum,
RemittanceSeqNum,
PRDocType,
PRDocNumber,
PRDocDate,
PRDocRef,
PEDocType,
PEDocNumber,
PEDocDate,
Amount,
AmountPaid ,
AmountOfDiscount,
AdjustmentReasonCode ,
AdjustmentAmount ,
RTRIM(LEFT(Notes,1000))
FROM temp_Premittances WHERE FileID = _ID;
END IF;
SELECT COUNT(PR.PID)
INTO @PRemmittanceCount
FROM Premittances PR
INNER JOIN Ps P ON P.PID = PR.PID AND P.ClientID = PR.ClientID
WHERE P.FileID = _ID;
IF EXISTS (SELECT PsCustomDataID FROM Ps_customdatasettings WHERE ClientID = @ClientID AND PsCustomDataID = 1 LIMIT 1)
THEN
INSERT INTO Ps_customdata
(
ClientID
,PID
,FileID
,Field1
)
SELECT
@ClientID
,@MaxPID + BP.PSeqNum
,FileID
,REFDescription
FROM temp_Ps BP
WHERE BP.FileID = _ID;
END IF;
INSERT INTO Pdeductions(
ClientID,
PID,
DeductionID,
DEDType,
CourtOrderNumber ,
CaseNumber,
PDate ,
Amount,
EmployeeSSNNumber,
MedicalSupportIndicator,
EmployeeName,
FIPSCode,
EmploymentTerminationIndicator)
SELECT @ClientID,
@MaxPID + PSeqNum,
DEDSeqNum,
DEDType,
CourtOrderNumber ,
CaseNumber,
PDate ,
Amount,
EmployeeSSNNumber,
MedicalSupportIndicator,
EmployeeName,
FIPSCode,
EmploymentTerminationIndicator
FROM temp_Pdeductions WHERE FileID = _ID;
SELECT COUNT(PD.PID)
INTO @PDeductionsCount
FROM Pdeductions PD
INNER JOIN Ps P ON P.PID = PD.PID AND P.ClientID = PD.ClientID
WHERE P.FileID = _ID;
INSERT INTO gsdata (
FileID,
PSeqNum,
FunctionalIdentifierCode,
ApplicationSenderCode,
ApplicationReceiverCode,
GSdate,
GStime,
GroupControlNumber,
ResponsibleAgencyCode,
Version )
SELECT
FileID,
PSeqNum,
FunctionalIdentifierCode,
ApplicationSenderCode,
ApplicationReceiverCode,
GSdate,
GStime,
GroupControlNumber,
ResponsibleAgencyCode,
Version
FROM temp_gsdata WHERE FileID = _ID;
SELECT COUNT(GS.FileID)
INTO @GsDataCount
FROM gsdata GS
WHERE GS.FileID = _ID;
INSERT INTO Ptransnumbers (
ClientID
,PID
,InterchangeControlNumber
,BatchControlNumber
,transSetControlNumber
,MsgCreationDate
,FileID
)
SELECT
@ClientID
,@MaxPID + PSeqNum
,InterchangeControlNumber
,BatchControlNumber
,transSetControlNumber
,MsgCreationDate
,FileID
FROM temp_Ptransnumbers WHERE FileID = _ID;
SELECT COUNT(PTN.PID)
INTO @PtransNumbersCount
FROM Ptransnumbers PTN
INNER JOIN Ps P ON P.PID = PTN.PID AND P.ClientID = PTN.ClientID
WHERE P.FileID = _ID;
INSERT INTO Premittanceadjustments(
ClientID,
PID,
RemittanceID ,
AdjustmentID,
Amount,
ReasonCode,
RefIDQualifier,
ReferenceID)
SELECT @ClientID,
@MaxPID + PSeqNum,
RemittanceSeqNum,
AdjustmentSeqNum,
Amount,
ReasonCode,
RefIDQualifier,
ReferenceID
FROM temp_Premittanceadjustments WHERE FileID = _ID;
SELECT COUNT(PR.AdjustmentID)
INTO @PAdjustmentsCount
FROM Premittanceadjustments PR
INNER JOIN Ps P ON P.PID = PR.PID AND P.ClientID = PR.ClientID
WHERE P.FileID = _ID;
UPDATE file SET PCount = @PCount WHERE FileID = _ID;
CREATE TEMPORARY TABLE tblRemittanceCount (
PID INT NOT NULL Primary Key,
RemittanceCount INT NULL);
INSERT INTO tblRemittanceCount
( PID, RemittanceCount )
SELECT PR.PID, COUNT(PR.RemittanceID)
FROM Ps P
INNER JOIN Premittances PR
ON (P.PID = PR.PID AND P.ClientID = PR.ClientID)
WHERE P.FileID = _ID
GROUP BY PR.PID;
CREATE TEMPORARY TABLE tblAdjustmentCount (
PID INT NOT NULL Primary Key,
ADXCount INT NULL);
INSERT INTO tblAdjustmentCount
( PID, ADXCount )
SELECT PA.PID, COUNT(PA.AdjustmentID)
FROM Ps P
INNER JOIN Premittanceadjustments PA
ON (P.PID = PA.PID AND P.ClientID = PA.ClientID)
WHERE P.FileID = _ID
GROUP BY PA.PID;
UPDATE Ps
INNER JOIN tblRemittanceCount
ON Ps.PID = tblRemittanceCount.PID
SET Ps.RemittanceCount = tblRemittanceCount.RemittanceCount
WHERE Ps.FileID = _ID;
UPDATE Ps
INNER JOIN tblAdjustmentCount
ON Ps.PID = tblAdjustmentCount.PID
SET Ps.AdjustmentCount = tblAdjustmentCount.ADXCount
WHERE Ps.FileID = _ID;
IF(@TempPCount = @PCount AND @TempPRemmittanceCount = @PRemmittanceCount AND
@TempPDeductionsCount = @PDeductionsCount AND @TempGsDataCount = @GsDataCount AND
@TempPAdjustmentsCount = @PAdjustmentsCount
) THEN
CALL sp_test_update(_ID, 70, 0, 'cd', 1, 0, 0);
ELSE
CALL sp_test_update(_ID, 63, 0, 'cd', 1, 0, 0);
INSERT INTO test (ServiceName, ClassName, MethodName, SP_Name, DataString, ErrorMessage, ErrorStackTrace, ErrorDataTime)
values('Database','Procedure','','test_procedure',
CONCAT('Temp P Count:' , @TempPCount , ' P Count:' , @PCount ,
'Temp P ramu Count:' , @TempPRemmittanceCount , ' P ramu Count:' , @PRemmittanceCount ,
'Temp P Deductions Count:' , @TempPDeductionsCount , ' P Deductions Count:' , @PDeductionsCount ,
'Temp GS Data Count:' , @TempGsDataCount , ' GS Data Count:' , @GsDataCount ,
'Temp P Adjustments Count:' , @TempPAdjustmentsCount , ' P Adjustments Count:' , @PAdjustmentsCount),
'Error in transdb.test_procedure procedure',
'', NOW());
END IF;
COMMIT;
INSERT INTO test (ServiceName, ClassName, MethodName, SP_Name, DataString, ErrorMessage, ErrorStackTrace, ErrorDataTime)
values('Database','Procedure','','test_procedure', CONCAT('FileID: ',_ID), 'Procedure log..Line 431', '', NOW());
END sp_Exit
Suggested fix:
just drop and create again works well for few days.
continue facing in production.