【问题标题】:Comparision of the timestamp in procedure not working程序中的时间戳比较不起作用
【发布时间】:2015-04-07 09:41:00
【问题描述】:

我在我的过程中编写了以下查询,它没有在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 列中,并且可以更改。并且比时间戳更新的版本是固定的,我将其存储在变量LAST_OLDER_VALLAST_OLDER_VAL_UNIT 中。我使用使用选择查询的插入将记录存储在表中,但它不起作用。

         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;

【问题讨论】:

  • 不工作是什么意思?你有什么错误吗?还是结果不正确?
  • 我没有收到任何错误,并且记录没有插入到 TEST 表中。问题出在我正在比较的选择查询条件中,这就是它不起作用的原因。
  • 考虑使用数据类型INTERVAL DAY TO SECOND而不是FREQUENCYFREQ_TIME_UNIT

标签: sql oracle stored-procedures cursor timestamp


【解决方案1】:

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

...
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。或者说真的为什么你会使用存储过程。

【讨论】:

  • 您好 Alex,我更改了我的问题并使用了您的条件,但出现缺少右括号的错误。我正在使用循环,因为在 KPI_DEFINITION 表中,您可以看到对于相同的 event_id,我们有不同的 kpi_frequency 和 kpi_frequency_unit,我想为同一个 event 考虑这些不同的时间戳。对于同一个 event_id,可以有更多的时间戳。我也可以使用你说的加入而不是循环,但逻辑是一样的,在这种情况下,它会考虑这两个时间戳为同一个 event_id 吗?
  • @Rahul - 你为什么改变了这个问题?是的,我在答案的第一行丢失了右括号;但是您还在第二行添加了一个额外的。 (我删除了一个冗余集,但不是很成功...)
  • 我正在使用过程,因为我在这个过程中完成了一些更多的事情并且正在执行但我停留在这一点上。使用循环它现在可以工作,但正如你所说,如果我不使用循环并使用连接,那么如果我将为同一个 event_id 定义超过 1 个时间戳,它会起作用吗?
  • 抱歉,我刚刚更改了我的问题中的程序,但该程序正在运行,我已经解决了括号问题。
  • @Rahul - 是的;不管怎样,你肯定会得到重复的——你会得到两条记录,记录 24 小时到 50 分钟前的所有内容。以及 50 到 30 分钟前的所有记录。连接仍然会稍微更有效率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多