Yesterday, an anomaly occurred in our legacy software that I've never seen before. It triggers the following error:
multiple rows in singleton select At procedure 'POINTS_BALANCE'
Here is the Stored Procedure
CREATE PROCEDURE POINTS_BALANCE (
OPERATOR CHAR (3),
PERIOD VARCHAR (75))
RETURNS (
P_BALANCE INTEGER)
AS
DECLARE VARIABLE B_DATE timestamp;
DECLARE VARIABLE E_DATE timestamp;
DECLARE VARIABLE ALLOWED_POINTS INTEGER;
begin
P_BALANCE = NULL;
SELECT DATE_BEGIN, DATE_END, TOTAL_POINTS FROM SCHED_POINT_PERIODS
WHERE DESCRIPTION = :PERIOD INTO :B_DATE, :E_DATE, :ALLOWED_POINTS;
IF (B_DATE IS NULL) THEN
BEGIN
SELECT DATE_BEGIN, DATE_END, TOTAL_POINTS FROM SCHED_POINT_PERIODS
WHERE cast('NOW' as timestamp) BETWEEN DATE_BEGIN AND DATE_END+1 INTO :B_DATE, :E_DATE,
:ALLOWED_POINTS;
END
IF (B_DATE IS NOT NULL) THEN
BEGIN
E_DATE = E_DATE + 1;
SELECT SUM(POINTS)+:ALLOWED_POINTS FROM SCHED_ACTUAL
WHERE OPR = :OPERATOR AND BEGIN_TIME BETWEEN :B_DATE AND :E_DATE
INTO :P_BALANCE;
IF (P_BALANCE IS NULL) THEN
P_BALANCE = ALLOWED_POINTS;
END
SUSPEND;
end
SCHED_ACTUAL
is a table that includes the check-in, check-out times of each user
SCHED_POINT_PERIODS
is a table that holds the Allowed_Point values for each period (like Spring 2013, Fall 2013, Christmas Break 2013)
I'm not sure which one is a singleton. Is there a way I can tell just from this stored procedure?
SCHED_POINT_PERIODS
are supposed to have non-overlapping periods. (i.e. they are supposed to be unique). This is the singleton that the error was referring to.I noticed this overlap via the DB and fixed this internally. The error is resolved.