使用游标的单个 for 语句内的多个循环
multiple loop inside single for statement using cursor
我的过程中有 2 个游标,我想为其使用单个 for 循环,因为使用它我想在单个 select 查询中循环 2 个变量。这两个变量有 2 个不同的值,在单个 select 查询中使用。这 2 个值来自 KPI_DEFINITION
table,它给了我时间戳,我想在我的 select 查询中比较它以进行数据提取。例如,第一列 KPI_FREQUENCY
的值为 30,KPI_FREQ_TIME_UNIT
列的值为 MINUTE。因此,如果我们合并这两列,我们将得到 30 MINUTE
并且还有另一个合并的列值,即 50 MINUTE
并且可能还有更多。所以这就是为什么我想把这个内部循环并在我的 select 查询中与 start_date
字段进行比较 value.But 不知道该怎么做。我只是使用 2 个游标来获取这 2 列并尝试在单个 for 循环中循环它但不知道该怎么做 that.There 如果我不想使用两个游标但没有找到可能是另一种解决方案方式。
create or replace PROCEDURE "EXT_TEST" AS
LAST_WF_ID Number := 0;
LAST_UNIT NUMBER:=10;
LAST_UNIT_VAL VARCHAR2(20);
CURSOR KPI_FREQUENCY_CUR IS
Select KPI_FREQUENCY INTO LAST_UNIT from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION WHERE
EVENT_ID = 10028;
CURSOR KPI_FREQ_TIME_UNIT_CUR IS
Select KPI_FREQ_TIME_UNIT INTO LAST_UNIT_VAL 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);
select MIN(ID) INTO LAST_WF_ID from WF_WORKFLOW@FONIC_RETAIL where start_date > sysdate - numtodsinterval(LAST_UNIT,LAST_UNIT_VAL);
DBMS_OUTPUT.PUT_LINE('LAST_WF_ID - ' || LAST_WF_ID);
END EXT_TEST;
Sample data from KPI_DEFINITION table:
KPI_DEF_ID KPI_FREQUENCY KPI_FREQ_TIME_UNIT EVENT_ID
1000136 30 MINUTE 10028
1000137 50 MINUTE 10028
等待查看您实际使用的数据......我建议尝试一些更简单的东西......例如:
select r.kpi_frequency, r.kpi_freq_time_unit, min(f.id)
from rator_monitoring_configuration.kpi_definition r,
wf_workflow@fonic_retail f
where r.event_id = 10028
and f.start_date > sysdate - numtodsinterval ( r.kpi_frequency, r.kpi_freq_time_unit );
group by r.kpi_frequency, r.kpi_freq_time_unit
order by r.kpi_frequency, r.kpi_freq_time_unit;
我的过程中有 2 个游标,我想为其使用单个 for 循环,因为使用它我想在单个 select 查询中循环 2 个变量。这两个变量有 2 个不同的值,在单个 select 查询中使用。这 2 个值来自 KPI_DEFINITION
table,它给了我时间戳,我想在我的 select 查询中比较它以进行数据提取。例如,第一列 KPI_FREQUENCY
的值为 30,KPI_FREQ_TIME_UNIT
列的值为 MINUTE。因此,如果我们合并这两列,我们将得到 30 MINUTE
并且还有另一个合并的列值,即 50 MINUTE
并且可能还有更多。所以这就是为什么我想把这个内部循环并在我的 select 查询中与 start_date
字段进行比较 value.But 不知道该怎么做。我只是使用 2 个游标来获取这 2 列并尝试在单个 for 循环中循环它但不知道该怎么做 that.There 如果我不想使用两个游标但没有找到可能是另一种解决方案方式。
create or replace PROCEDURE "EXT_TEST" AS
LAST_WF_ID Number := 0;
LAST_UNIT NUMBER:=10;
LAST_UNIT_VAL VARCHAR2(20);
CURSOR KPI_FREQUENCY_CUR IS
Select KPI_FREQUENCY INTO LAST_UNIT from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION WHERE
EVENT_ID = 10028;
CURSOR KPI_FREQ_TIME_UNIT_CUR IS
Select KPI_FREQ_TIME_UNIT INTO LAST_UNIT_VAL 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);
select MIN(ID) INTO LAST_WF_ID from WF_WORKFLOW@FONIC_RETAIL where start_date > sysdate - numtodsinterval(LAST_UNIT,LAST_UNIT_VAL);
DBMS_OUTPUT.PUT_LINE('LAST_WF_ID - ' || LAST_WF_ID);
END EXT_TEST;
Sample data from KPI_DEFINITION table:
KPI_DEF_ID KPI_FREQUENCY KPI_FREQ_TIME_UNIT EVENT_ID
1000136 30 MINUTE 10028
1000137 50 MINUTE 10028
等待查看您实际使用的数据......我建议尝试一些更简单的东西......例如:
select r.kpi_frequency, r.kpi_freq_time_unit, min(f.id)
from rator_monitoring_configuration.kpi_definition r,
wf_workflow@fonic_retail f
where r.event_id = 10028
and f.start_date > sysdate - numtodsinterval ( r.kpi_frequency, r.kpi_freq_time_unit );
group by r.kpi_frequency, r.kpi_freq_time_unit
order by r.kpi_frequency, r.kpi_freq_time_unit;