2013-12-19 31 views
0

昨天,我们以前从未见过的旧版软件出现异常。它触发以下错误: multiple rows in singleton select At procedure 'POINTS_BALANCE'Singleton Select多行选择

这里是存储过程

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是包括每个用户 SCHED_POINT_PERIODS的入住,退房时间的表是保持一个表每个时期的Allowed_Point值(如2013年春季,2013年秋季,2013年圣诞假期)

我不确定哪一个是单身人士。有没有一种方法可以从这个存储过程中看出来?

+1

单独运行每个查询与问题输入并查看结果是 – jle

+0

谢谢@jle!我用伪代码在概念上做了这件事,并找出了导致问题的原因。 –

回答

0

SCHED_POINT_PERIODS应该有不重叠的时期。 (即它们应该是唯一的)。这是错误所指的单身人士。

我注意到这个重叠通过数据库,并在内部解决这个问题。错误已解决。