所有
为了简单起见,我在下面创建了以下场景以帮助解决问题,这与我遇到的实际问题非常接近。
有一个名为“ State ”的表格,对于所有意图和目的,它都包含一个与另一个名为“ Stock ”的表相关的值,该表保存有关对象的数据。
e.g。
+-----+-------+
|TABLE| VALUE |
+-----+-------+
|Stock| Ball |
+-----+-------+
|State|Instock|
+-----+-------+
因此,根据上述情况,Stock表中名为“Ball”的记录根据State表是“Instock”。
然而,为了得出这个结论,我需要分析另一个名为Items的表,它是现实世界中存在多少物理项目的真实值。因此,如果有物品或没有物品可用,这将影响与该股票记录相关的州表。
现在要分析这个并修改状态,我需要从State表开始并通过Stock表导航到Items表,如此
State ----> Stock ----> Items
现在这张表中有很多记录,至少每天都需要监控。
我之前从未开始过这样的事情,但是我的直觉告诉我,我可以将所有表格加载到我的分析应用程序中,并将其作为数据对象加载到内存中,实际上形成关系。
所以我需要做的就是在开始时进行一个大查询并将所有SQL结果加载到内存中。这可能还是明智的?
然而,我考虑的其他选项只是迭代每个记录,如此。顺序完成许多交易。
State record 1 ----> Stock record 1 ----> Analyse Items records --> Update State record 1
State record 2 ----> Stock record 2 ----> Analyse Items records --> Updates State record 2
.......
这些方式中的任何一种都是不错的选择,还是有其他方法可以做到这一点?
约束
伪代码
Get all state records in State table
Find their related records in Stock table
Find all child records of Stock table in Items table
Modify state of current record
Move onto next record set.
因此,我可以欢迎任何可以用于此问题的指导或具体方法/特征。
请不要给我一个解决方案,只要在正确的方向上稍微推动就是我要问的一切:)
答案 0 :(得分:1)
我的建议是写一个PL / SQL代码块,然后通过预定的作业调用它。
日程安排文件: http://docs.oracle.com/cd/B28359_01/server.111/b28310/schedadmin006.htm
没有理由使用Java或Perl处理这个问题,因为这只是oracle环境之外的必要连接和配置。还有一个要记住维护的应用程序,而如果它在Oracle中,它将很容易访问,并且可以管理(尽管仍然将它放在源代码管理中)。
至于实际查询,这不应该太难。您可以根据每个表中的行数来设置简单的更新。像
这样的东西UPDATE STATE SET STATE.INSTOCK = TRUE
WHERE STATE.PK IN (
SELECT ITEMS.STATEFK FROM ITEMS WHERE ITEMS.COUNT > 0
);
然后执行相同的操作,但设置为false,其中count< = 0。
对于PL / SQL,这根本不是正确的语法,但应该让您大致了解查询应该如何工作。
答案 1 :(得分:1)
我首先要说状态表是一个坏主意。您已根据项目数知道状态,因此(经常)更改状态,您的状态表包含无效(过期)条目。我还假设你无法改变这种结构,只需要不断地保持这种状态。
我将作为单个更新语句运行(确保您有足够的回滚),但受影响的30k行不是很大。例如:
> set serveroutput on
> drop table stock
table STOCK dropped.
> create table stock
(
stock_id number,
name varchar2(20)
)
table STOCK created.
> drop table item
table ITEM dropped.
> create table item
(
item_id number,
stock_id number,
num number
)
table ITEM created.
> drop table state
table STATE dropped.
> -- this really doesnt need to exist
> create table state
(
stock_id number,
val varchar2(20)
)
table STATE created.
> insert into stock values (1,'Ball')
1 rows inserted.
> insert into stock values (2,'Chair')
1 rows inserted.
> insert into stock values (3,'Pen')
1 rows inserted.
> insert into item (item_id, stock_id, num) values (1, 1, 35)
1 rows inserted.
> insert into item (item_id, stock_id, num) values (2, 2, 0)
1 rows inserted.
> insert into item (item_id, stock_id, num) values (3, 3, 1)
1 rows inserted.
> insert into state (stock_id, val) values (1, 'InStock')
1 rows inserted.
> insert into state (stock_id, val) values (2, 'OutOfStock')
1 rows inserted.
> insert into state (stock_id, val) values (3, 'InStock')
1 rows inserted.
> commit
committed.
> -- change number of items for Chairs
> update item set num=5 where stock_id = (select stock_id from stock where name = 'Chair')
1 rows updated.
> commit
committed.
> -- state is now wrong
> select st.name, i.num, s.val
from stock st, state s, item i
where st.stock_id = i.stock_id
and st.stock_id = s.stock_id
NAME NUM VAL
-------------------- ---------- --------------------
Ball 35 InStock
Chair 5 OutOfStock
Pen 1 InStock
> -- now we need to maintain "State" table
> update state st
set (st.val) = (
select decode(i.num, 0, 'OutOfStock','InStock')
from item i
where i.stock_id = st.stock_id
)
-- only update those with invalid state values
where exists (
select stock_id
from item i
where i.stock_id = st.stock_id
and st.val <> decode(i.num, 0, 'OutOfStock','InStock')
)
1 rows updated.
> commit
committed.
> -- state is corrected
> select st.name, i.num, s.val
from stock st, state s, item i
where st.stock_id = i.stock_id
and st.stock_id = s.stock_id
NAME NUM VAL
-------------------- ---------- --------------------
Ball 35 InStock
Chair 5 InStock
Pen 1 InStock