【问题标题】:multiple loop inside single for statement using cursor使用游标的单个for语句内的多个循环
【发布时间】:2015-03-31 14:01:49
【问题描述】:

我的过程中有 2 个游标,我想使用单个 for 循环,因为使用它我想在单个选择查询中循环 2 个变量。这两个变量有 2 个不同的值,用于单选查询。这两个值来自KPI_DEFINITION 表,它为我提供了我想在我的选择查询中比较数据提取的时间戳。第一列 KPI_FREQUENCY 的值为例如 30,KPI_FREQ_TIME_UNIT 列的值为 MINUTE。因此,如果我们将这 2 列组合起来,我们将得到 30 MINUTE 并且还有另一个组合列值 50 MINUTE 并且可能还有更多。所以这就是为什么我想把它放在循环中并在我的选择查询中与start_date 字段值进行比较。但不知道该怎么做。我只是使用 2 个游标来获取这 2 列并尝试在单个 for 循环中循环它,但不知道该怎么做。如果我不想使用两个游标但没有找到方法,可能还有另一种解决方案。

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

【问题讨论】:

  • 为什么不加入这些表格?听起来您有一对一的关系..单个 KPI_FREQUENCY 与单个 KPI_FREQ_TIME_UNIT 匹配?您可以发布一些您拥有的示例数据吗?以及你期望看到的输出?
  • 嗯,刚刚注意到,我提到的“1对1”关系是同一张表! O.o 这看起来你做的事情都错了..正在重写..请发布一些示例数据。
  • 实际上这两列都在 KPI_DEFINITION 表中,所以我认为它不可能加入它吗?我已经在这 2 列中给出了样本值,即 30 分钟。 KPI_FREQUENCY 包含值 30 和 KPI_FREQ_TIME_UNIT 包含值 MINUTE。所以我想把它作为组合输入并在我的选择查询中使用,以便与 start_date 进行比较以执行数据提取。所以我会得到例如从 start_date 开始的 30 MINUTE 的数据。
  • 不需要加入,因为它们是同一张表.. 也不需要 2 个游标;) 请发布一些示例数据。
  • 我没有得到您需要的样本数据?你能告诉我你需要什么数据吗?

标签: sql oracle for-loop stored-procedures cursor


【解决方案1】:

等待查看您实际使用的数据......我建议尝试一些更简单的东西......例如:

  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;

【讨论】:

  • 能否请您检查有问题的示例数据。没有循环它会工作吗?
  • you 可以试试这个查询,看看它是如何处理您的数据的吗?如果出现错误并发布结果,或解释您期望的结果?
  • 您好,此查询完美运行,并给出了我想要的结果 :) 谢谢,现在无需编写光标或循环。
  • 经验教训:永远不要在 PL/SQL 中做你在纯 SQL 中可以做的事情;)如果可以的话,总是寻找一个纯 SQL 解决方案。从长远来看,它会更简单、更容易并且性能更好。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2012-08-28
  • 2018-05-27
  • 1970-01-01
  • 2021-09-27
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多