首页 > 解决方案 > 循环游标 - PL/SQL

问题描述

我正在分析一年多的大量数据。方法是在光标的帮助下一次选择一天的数据,并继续用全年数据提供另一个表:-


declare
  i_start_date  date := date '2019-04-01';
  i_end_date    date := date '2019-04-02';
begin  
  for cur_r in (select a.id, b.status
                from table1 a join table2 b on a.msg_id = b.msg_id
                where b.t_date between i_start_date and i_end_date
               )
  loop
    insert into test_table (id, status)
      values (cur_r.id, cur_r.status);
  end loop;
end;
/

你能帮我在 PL/SQL 块中运行这个游标,并进行错误处理吗?

如下所示:-

declare
  i_start_date  date := date '2019-01-01'; --start date set
  i_end_date    date := date '2019-12-31'; --end date set
begin

for i_start_date<=i_end_date --condition to fetch data & insert
  (for cur_r in (select a.id, b.status
                from table1 a join table2 b on a.msg_id = b.msg_id
                where b.t_date = i_start_date
               )
  loop
    insert into test_table (id, status)
      values (cur_r.id, cur_r.status);
  end loop;)

  i_start_date+1 -- increment start date


end;
/

谢谢,

标签: oracleplsql

解决方案


为什么你甚至需要pl/sql?

insert into test_table (id, 
                        status
                        )
      values (select a.id, 
                     b.status
              from table1 a 
              join table2 b on a.msg_id = b.msg_id
              where b.t_date between date '2019-04-01
                                 and date '2019-04-02'
                and b.t_date not in (select t_date
                                     from status)
;

但是请注意,在您比较 DATE(我只是简单地复制了)时,oracle DATE 始终包含一个时间组件,并且上述比较会将您提供的日期截断为午夜。因此,将不会选择 b.t_date = to_date('2019-04-02 09:10:11','yyyy-mm-dd') 的行。


推荐阅读