2015-04-07 2 views
0

В моей процедуре я написал следующий запрос, который не вставляет записи в таблицу 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_FREQUENCY и KPI_FREQUENCY_UNIT, и это может быть changabler. И более новая, чем временная метка, фиксирована, и я сохранил ее в varaible LAST_OLDER_VAL и LAST_OLDER_VAL_UNIT. Я использовал вставку, используя запрос select, чтобы хранить записи в таблице, но не работает.

  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 [email protected]_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 [email protected]_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; 
+0

Что означают, что вы не работаете? Вы получаете какую-либо ошибку? Или неправильный результат? – Noel

+0

Я не получаю никаких ошибок, и записи не вставляются в таблицу TEST. Проблема заключается в моем выборе условия запроса, где я сравниваю, и почему он не работает. – Andrew

+1

Учитывайте использование типа данных 'INTERVAL DAY TO SECOND' вместо' FREQUENCY' и 'FREQ_TIME_UNIT'. –

ответ

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 ... select, который соединяет WF_WORKFLOW_CUR и [email protected]_RETAIL. Или действительно, почему вы использовали бы хранимую процедуру вообще.

+0

Здравствуйте, Алекс, я изменил свой вопрос и использовал ваше условие, но при этом не было ошибок в правильной круглой скобке. И я использую цикл, потому что в таблице KPI_DEFINITION вы можете видеть, что у меня есть разные kpi_frequency и kpi_frequency_unit для одного и того же event_id, и я хочу рассмотреть эту разную временную метку для того же события. И может быть больше метки времени для того же event_id. Я также могу использовать join, как вы сказали, вместо цикла, но логика будет одинаковой, и в этом случае он рассмотрит обе эти временные метки для одного события event_id? – Andrew

+0

@Rahul - почему вы изменили вопрос? Да, я потерял правильную скобку в первой строке моего ответа; но вы также добавили дополнительный во второй строке. (Я удалил избыточный набор, но не совсем успешно ...) –

+0

Я использую процедуру, потому что у меня есть еще несколько вещей, которые выполняются в этой процедуре, и которая выполняется, но я застрял на этом этапе. Использование цикла его работы теперь, но, как вы сказали, если я не использую цикл и использовать join, то будет ли он работать, если у меня будет более 1 временной метки, определенной для той же event_id? – Andrew

Смежные вопросы