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

时间:2015-04-07 09:41:01

标签: sql oracle stored-procedures cursor timestamp

我在我的程序中写了一个以下查询,该查询没有在TEST表中插入记录。 KPI definition表具有以下记录:

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

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

         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;

1 个答案:

答案 0 :(得分:1)

您目前正在寻找超过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 );

不直接相关,但我不确定您为什么要使用循环,而不是加入insert ... selectWF_WORKFLOW_CUR的{​​{1}}。或者你真的为什么要使用存储过程。