0

作成から 120 秒以内にユーザーがレポート データにアクセスしているかどうかを確認する BeforeReport トリガーを作成しようとしています。

私のコードは次のとおりです。

function BeforeReport return boolean is

ENTRYDATE TIMESTAMP;
SERVERDATE TIMESTAMP;
DIFFSECONDS NUMBER;
begin

/*Checks to see if user is accessing the data within 120 seconds of creation in database*/
VALIDTIMELENGTH := 120;
SELECT SYS_DATE INTO ENTRYDATE FROM WOS_REPORT_PARAM WHERE SEQUENCE_NUM=UPPER(:SEQUENCENUM) AND PARAMETER='year';
SERVERDATE := CURRENT_TIMESTAMP;
DIFFSECONDS := ((EXTRACT(YEAR FROM ENTRYDATE)- EXTRACT(YEAR FROM SERVERDATE))*31536000) +
             ((EXTRACT(MONTH FROM ENTRYDATE)- EXTRACT(MONTH FROM SERVERDATE))*2592000) +
             ((EXTRACT(DAY FROM ENTRYDATE) - EXTRACT(DAY FROM SERVERDATE))*86400) +
             ((EXTRACT(HOUR FROM ENTRYDATE) - EXTRACT(HOUR FROM SERVERDATE))*3600) +
             ((EXTRACT(MINUTE FROM ENTRYDATE) - EXTRACT(MINUTE FROM SERVERDATE))*60) +
             (EXTRACT(SECOND FROM ENTRYDATE) - EXTRACT(SECOND FROM SERVERDATE));
  IF DIFFSECONDS > VALIDTIMELENGTH THEN RETURN(FALSE);
  ELSE
  return (TRUE);
  END IF;
  END;

問題は、時間が経過したにもかかわらず、コードが true を返すように見えることです。秒/分のコードを正しく実装していませんか? 奇妙なことに、私は両方のリターン (FALSE) を試してみましたが、それでもレポートに合格しました! Oracle Reports は、腹立たしいほど一貫性がありません。どんな反応でも大歓迎です。

4

1 に答える 1

0

wos_report_param.sys_dateが a の場合( aを返す関数がある場合にTIMESTAMP列に名前を付けるのはかなり混乱することに注意してください)、それが過去のタイムスタンプであると仮定すると、ロジックはかなり単純化できます。sys_datesysdateDATEwos_report_param.sys_date

IF( current_timestamp - entrydate > numtodsinterval( validTimeLength, 'second' ) )
THEN
  RETURN true;
ELSE 
  RETURN false;
END IF;

私の推測が正しく wos_report_param.sys_date、過去のタイムスタンプであるdiffseconds場合、計算している は負の数になり、プロシージャが常に を返す理由を説明しますfalse。負の間隔ではなく正の間隔を生成するには、後の日付から前の日付を減算する必要があります。または、計算をabs回避することもできます。diffseconds

于 2012-08-29T23:12:36.360 に答える