比较程序中的时间戳不起作用

Comparision of the timestamp in procedure not working

我在我的程序中编写了以下查询,它没有在 TEST table 中插入记录。 KPI definition table 有如下记录:

KPI_DEF_ID  KPI_FREQUENCY KPI_FREQ_TIME_UNIT  EVENT_ID
1000136     30            MINUTE                10028   
1000137     50            MINUTE                10028

我有一个应用程序,用户希望在其中根据时间戳获取记录。因此用户可以在应用程序中输入以获取例如早于 30 分钟和晚于 24 小时的记录。时间戳是可变的。比时间戳更早的来自 KPI DEFINITION table 并且存储在列 KPI_FREQUENCYKPI_FREQUENCY_UNIT 中并且可以更改。并且比时间戳更新的是固定的,我将其存储在变量 LAST_OLDER_VALLAST_OLDER_VAL_UNIT 中。我使用使用 select 查询的插入将记录存储在 table 中,但它不起作用。

         create or replace PROCEDURE "EXT_TEST" AS 

LAST_WF_ID Number := 0;
--LAST_UNIT NUMBER:=10;
--LAST_UNIT_VAL VARCHAR2(20);
LAST_OLDER_VAL NUMBER := 24;
LAST_OLDER_VAL_UNIT VARCHAR2(10) := 'HOUR';

CURSOR WF_WORKFLOW_CUR IS
Select KPI_DEF_ID,KPI_FREQUENCY,KPI_FREQ_TIME_UNIT,EVENT_ID,BUSINESS_CHECK_PERIOD_ID FROM RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION where EVENT_ID=10028;
BEGIN

--DBMS_OUTPUT.PUT_LINE('LAST_UNIT - ' || LAST_UNIT);
--DBMS_OUTPUT.PUT_LINE('LAST_UNIT_VAL - ' || LAST_UNIT_VAL);

-- removed, retrieve  a new START_ID from source first, don't use the last id.
--SELECT LAST_TASK_ID INTO LAST_WF_ID FROM CAPTURING where DB_TABLE='TEMP_WF_WORKFLOW';

FOR WF_WORKFLOW_ROW IN WF_WORKFLOW_CUR
LOOP

--select MIN(ID) INTO LAST_WF_ID from WF_WORKFLOW@FONIC_RETAIL WF where WF.START_DATE > sysdate - numtodsinterval ( WF_WORKFLOW_ROW.KPI_FREQUENCY, WF_WORKFLOW_ROW.KPI_FREQ_TIME_UNIT );

Insert into TEST(ID,NAME,SUBSCRIPTION_ID,START_DATE,STATUS_ID,ACCOUNT_ID,END_DATE)
Select DISTINCT(WF.ID),WF.NAME,WF.SUBSCRIPTION_ID,WF.START_DATE,WF.STATUS_ID,WF.ACCOUNT_ID,WF.END_DATE
from WF_WORKFLOW@FONIC_RETAIL WF where WF.STATUS_ID = 0 and WF.NAME = 'SIGNUP_MOBILE_PRE_PAID'
and WF.START_DATE > SYSDATE - numtodsinterval ( LAST_OLDER_VAL, LAST_OLDER_VAL_UNIT
and WF.START_DATE < SYSDATE - numtodsinterval ( WF_WORKFLOW_ROW.KPI_FREQUENCY, WF_WORKFLOW_ROW.KPI_FREQ_TIME_UNIT ));

DBMS_OUTPUT.PUT_LINE('WF_WORKFLOW_ROW.KPI_FREQUENCY - ' || WF_WORKFLOW_ROW.KPI_FREQUENCY);
DBMS_OUTPUT.PUT_LINE('WF_WORKFLOW_ROW.KPI_FREQ_TIME_UNIT - ' || WF_WORKFLOW_ROW.KPI_FREQ_TIME_UNIT);

END LOOP;

END EXT_TEST;

您目前正在查找早于 24 小时且晚于 30 分钟的开始日期。这是不可能的,而不是你所说的你需要的,所以这不是你真正的意思。看起来你只是把 <> 的比较搞错了:

...
and WF.START_DATE > SYSDATE - numtodsinterval ( LAST_OLDER_VAL, LAST_OLDER_VAL_UNIT )
and WF.START_DATE < SYSDATE - numtodsinterval ( WF_WORKFLOW_ROW.KPI_FREQUENCY, WF_WORKFLOW_ROW.KPI_FREQ_TIME_UNIT );

不直接相关,但我不确定您为什么为此使用循环,而不是连接 WF_WORKFLOW_CURWF_WORKFLOW@FONIC_RETAIL 的单个 insert ... select。或者你为什么要使用存储过程。