用例:
我正在创建一个网页,人们可以在某些预定的公共活动中订阅。
数据库表格为Persons -> Subscriptions -> Events -> Days -> Activities
限制:
此人可以订阅每个可用的活动,只要这些活动在一天或多天内没有共同的一项或多项活动。
解决方案:
因此,当用户尝试订阅某个事件时,数据库应该使用StartMoment
和EndMoment
的时间来迭代他/她已订阅的其他活动事件,查找当天发生的事件这个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);
答案 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