如何迭代查找事件记录中的时间冗余?

时间:2015-11-13 14:14:59

标签: oracle plsql iteration

用例:

我正在创建一个网页,人们可以在某些预定的公共活动中订阅。

数据库表格为Persons -> Subscriptions -> Events -> Days -> Activities

限制:

此人可以订阅每个可用的活动,只要这些活动在一天或多天内没有共同的一项或多项活动。

解决方案:

因此,当用户尝试订阅某个事件时,数据库应该使用StartMomentEndMoment的时间来迭代他/她已订阅的其他活动事件,查找当天发生的事件这个Days表的字段。

如何:

我是Oracle新手。我习惯了Firebird和MySQL,我以前从不需要使用 iterators 。我刚刚在编程代码中做了检查之王,但现在我希望这个逻辑在数据库中独立于平台。

任何人都能说出最聪明的方法是什么,这样做的代码不会太乱,太慢?

数据(简化):

  Table Persons: Id, name(varchar), identify(varchar), phone(varchar);
  Table Subscriptions: Id, personId, eventId, reg_date(date);
  Table Events: Id, description(string), hours, contacts(string);
  Table Days: Id, eventId, day(date), begin(time), end(time), allday(bool);
  Table Activities: Id, dayId, eventId, begin(time), end(time), duration(0 for allday, or minutes), description(varchar);

1 个答案:

答案 0 :(得分:1)

如果要遍历表中的每条记录,最简单的方法是使用for rc in (select * from mytable) loop end loop;语法。这是一个语句的隐式游标,请在此处查看更多信息 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#CHDBJBJE 你的逻辑将是:

begin
  for rcPersons in (select * from Persons) loop
    for rcSubscriptions in (select * from Subscriptions where personId= rcPersons.Id) loop
       for rcEvents in (select * from Events where id = rcSubscriptions.eventId) loop
          null; --<do some logic here>      
       end loop;
    end loop;
  end loop;
end;

p.s if you provide scripts to create test tables and data it would be easy to find most effective solution. I think it could be done via one SQL, but need more info to be sure