0

全部,

请注意,为简单起见,我在下面创建了以下场景来帮助解决这个问题,这与我遇到的实际问题非常接近。

有一个名为“ State ”的表,出于所有意图和目的,该表包含一个与另一个名为“ Stock ”的表相关的值,该表包含有关对象的数据。

例如

+-----+-------+
|TABLE| VALUE |
+-----+-------+
|Stock| Ball  |
+-----+-------+
|State|Instock|
+-----+-------+

所以从上面的例子来看,根据 State 表,Stock 表中名为“Ball”的记录是“Instock”。

然而,为了得出这个结论,我需要分析另一个名为 Items 的表,它是现实世界中存在多少该库存的物理项目的真实值所以如果有可用的项目或没有可用的项目,这将影响 State 表中的值与该 Stock 记录相关的内容。

现在要分析它并修改状态,我需要从 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
.......

这些方法中的任何一种都是一个不错的选择,还是有另一种方法可以做到这一点?

约束

  • Oracle 11g 数据库
  • 无法更改架构或表
  • 考虑将JavaPerl用于此分析应用程序
  • 此应用程序将是外部的,并且与数据库不在同一物理位置

伪代码

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.

因此,我可以用于解决此问题的任何指导或特定方法/功能都将受到欢迎。

请不要给我一个解决方案,我只要求在正确的方向上轻轻一点:)

4

2 回答 2

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
    );

然后做同样的事情,但在 count <= 0 的地方设置为 false。

对于 PL/SQL,这根本不是正确的语法,但应该让您大致了解查询应该如何工作。

于 2013-09-19T15:15:33.243 回答
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    
于 2013-09-19T16:26:52.473 回答